home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

Python/MultiVersionCoexisting(複数バージョン共存) (v1)

Python/MultiVersionCoexisting(複数バージョン共存) (v1)

Python / MultiVersionCoexisting(複数バージョン共存) (v1)
id: 1255 所有者: msakamoto-sf    作成日: 2014-01-19 12:19:09
カテゴリ: Python 

一つのマシンで複数バージョンのPythonを共存させるメモ。

複数バージョンといっても、Pythonのインタープリタを共存させるのか、site-packages以下のライブラリ空間を共存させるのか、あるいはその両方か、でアプローチが変わる。

site-packages以下のライブラリ空間を共存させたい場合:

目的
システムにインストールされたPythonパッケージライブラリとは別に、site-packages以下のライブラリ空間を分離したい。
  • ディストリビューションがインストールして使用するライブラリXXXXのバージョンと、使用したいアプリが必要とするライブラリXXXXのバージョンが異なり、メジャーバージョンが違うためインターフェイスの互換性が無い。そのため、アプリ専用にライブラリXXXXをインストールするディレクトリを分離したい。
  • 複数のプロダクトを開発するときに、プロダクトごとに必要とするライブラリとそのバージョンが異なるため、それぞれに専用のライブラリインストール先を用意して使い分けたい。
アプローチ
virtualenv, virtualenvwrapper

Pythonインタープリタを複数バージョン共存させたい場合:

目的
システムにインストールされたPythonインタープリタとは異なるバージョンを使いたい。
  • 使用したいアプリが必要とするPythonのバージョンが、ディストリビューションがインストールするものとは異なっている。安全のため、アプリ専用に分離してPythonインタープリタをインストールしたい。
アプローチ
手動コンパイル, pyenv

なお、virtualenv(wrapper)は手動コンパイルやpyenvと組み合わせることも出来る。そのため、Pythonインタープリタ+ライブラリ空間をペアにして、丸ごと分離したsandbox環境を構築することも可能。

以下、アプローチに挙げた手法について紹介していく。

2014-01版実験環境
CentOS 6.3 x86_64版 (Minimal Desktop インストール)
python-2.6.6-51.el6.x86_64
virtualenv : 1.11
virtualenvwrapper : 4.2

virtualenv

virtualenvはPythonのインタープリタ+ライブラリ環境をセットで分離するためのツールセットになる。カバー範囲はあくまでも環境を分離する機能であり、Pythonインタープリタを自動でDLしてビルドしたり、あるいはライブラリを自動でDLして分離環境に展開したり、という機能はない。(Hook機能はあるようなので、上手く調整すれば可能かもしれない。)

「分離した環境」というのは、後述するがディレクトリとファイルのセットであり、以下の様な要素で構成されている。

bin/
    環境変数調整用のスクリプトファイル
    その分離環境で使用するPythonインタープリタのコピー
    easy_installコマンドなど
include/
    その分離環境で使用するPythonインタープリタインストール先のincludeへのsymlink
lib/
    基本パッケージのsymlink
    site-packages/ (分離環境専用, setuptools展開済みになってたりなど)

※virtualenvの解説で、Pythonインタープリタも複数バージョン切り替えられるようになるという解説があるが、Pythonインタープリタのインストールはvirtualenvの範囲外である。別途手動でビルドするか、pyenvなどでインストールしておく必要がある。virtualenvには、分離環境で使用するPythonインタープリタの位置を指定することが可能なため、もしインストールしているのであれば、別バージョンのPythonインタープリタを使う分離環境を設定可能である、という程度に過ぎない。

pipからのインストール: virtualenvは、システムのsite-packagesにインストールする必要がある。virtualenv自体で作成した分離環境にはインストールしない。

# pip install virtualenv
Downloading/unpacking virtualenv
  Downloading virtualenv-1.11.tar.gz (1.6MB): 1.6MB downloaded
  Running setup.py (path:/tmp/pip_build_root/virtualenv/setup.py) egg_info for package virtualenv
    warning: no previously-included files matching '*' found under directory 'docs/_templates'
    warning: no previously-included files matching '*' found under directory 'docs/_build'
Installing collected packages: virtualenv
  Running setup.py install for virtualenv
    warning: no previously-included files matching '*' found under directory 'docs/_templates'
    warning: no previously-included files matching '*' found under directory 'docs/_build'
    Installing virtualenv script to /usr/bin
    Installing virtualenv-2.6 script to /usr/bin
Successfully installed virtualenv
Cleaning up...

インストールに成功したので、実際に分離環境(ディレクトリ構成)を作成してみる。
使ってみる。お好みの場所にcdしてから "virtualenv" コマンドに環境名を指定する。

$ virtualenv TEST1
New python executable in TEST1/bin/python
Installing setuptools, pip...done.

"環境名"で作成されたディレクトリの中を覗いてみる。

./TEST1/
bin/
    activate
    activate.csh
    activate.fish
    activate_this.py
    easy_install        # easy_installのsymlinkではなくて実体。
    easy_install-2.6    # easy_installのsymlinkではなくて実体。
    pip                 # pipのsymlinkではなくて実体。
    pip2                # pipのsymlinkではなくて実体。
    pip2.6              # pipのsymlinkではなくて実体。
    python              # ELF実行バイナリ
        (今回の実行例ではvirtualenv実行時に使った=システムインストールの/usr/bin/pythonのコピー)
    python2 -> python   # /usr/bin/ではなく、↑のpythonへのsymlink
    python2.6 -> python # /usr/bin/ではなく、↑のpythonへのsymlink

include/python2.6 -> /usr/include/python2.6/

lib64/ -> lib/
lib/
    python2.6/
        xxx.py   # /usr/lib64/python2.6/xxx.py へのsymlink
        xxx.pyc  # xxx.py のコンパイルキャッシュ
        site-packages/  # easy_install, pip のインストール実体ファイル群

"bin/activate" の内容で「なるほどな~」と思った点を抜粋:

# 既に取り込み済みであれば、元の値に戻すための関数
deactivate () {
    ....
}

# 既に取り込み済みであれば、元の値を復元
# unset irrelevant variables
deactivate nondestructive

# virtualenvコマンド実行時に生成・埋め込まれた"VIRTUAL_ENV"
VIRTUAL_ENV="/home/msakamoto/work/TEST1"
export VIRTUAL_ENV

# 実行前のPATHを"_OLD_VIRTUAL_PATH"に退避(保存)
_OLD_VIRTUAL_PATH="$PATH"
# VIRTUAL_ENVをPATHに追加
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

実際に実行してみる。
実行前:

$ python
Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.path
# 見やすく改行
['', 
'/usr/lib/python2.6/site-packages/setuptools-2.1-py2.6.egg', 
'/usr/lib/python2.6/site-packages/pip-1.5-py2.6.egg', 
'/usr/lib64/python26.zip', 
'/usr/lib64/python2.6', 
'/usr/lib64/python2.6/plat-linux2', 
'/usr/lib64/python2.6/lib-tk', 
'/usr/lib64/python2.6/lib-old', 
'/usr/lib64/python2.6/lib-dynload', 
'/usr/lib64/python2.6/site-packages', 
'/usr/lib64/python2.6/site-packages/gtk-2.0', 
'/usr/lib/python2.6/site-packages']

実行:bashの場合、 bin/activate を source で取り込む。

$ source work/TEST1/bin/activate
(TEST1)[...]$ python     # <-- プロンプト($PS1)も変更されてる。
# インタープリタはシステムでインストールされたものがコピーされてるので、実行前と同じ。
Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.path
# 見やすく改行→システムではなく、"TEST1"以下のsite-packagesを見るよう変更されてる。
['', 
'/home/msakamoto/work/TEST1/lib64/python26.zip', 
'/home/msakamoto/work/TEST1/lib64/python2.6', 
'/home/msakamoto/work/TEST1/lib64/python2.6/plat-linux2', 
'/home/msakamoto/work/TEST1/lib64/python2.6/lib-tk', 
'/home/msakamoto/work/TEST1/lib64/python2.6/lib-old', 
'/home/msakamoto/work/TEST1/lib64/python2.6/lib-dynload', 
'/usr/lib64/python2.6', 
'/usr/lib/python2.6', 
'/home/msakamoto/work/TEST1/lib/python2.6/site-packages']
>>> quit()

(TEST1)[...]$ echo $PATH
/home/msakamoto/work/TEST1/bin:/usr/lib64/qt-3.3/bin:(...)
(TEST1)[...]$ echo $VIRTUAL_ENV
/home/msakamoto/work/TEST1

環境を戻すには、"deactivate"コマンドをシェルから実行する。("deactivate"コマンドは"bin/activate"をsourceで取り込んだ時に定義される)

(TEST1)[...]$ deactivate 
# プロンプトが元に戻る。
[...]$ 
[...]$ echo $PATH
/usr/lib64/qt-3.3/bin:(...) # $PATHも元に戻ってる。
[...]$ python
Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.path
['', '/usr/lib/python2.6/site-packages/setuptools-2.1-py2.6.egg', (...)]
# 元に戻ってる。

他、参考:

virtualenvwrapper

virtualenvは便利だが、作成した環境(=ディレクトリ)の位置を覚えておく必要があり、使う都度 source でactivateを取り込む必要がある。
virtualenvで作成した環境を管理し、環境の切り替えのショートカットコマンドを提供してくれるのが virtualenvwrapper となる。

pipからインストール出来る。

# pip install virtualenvwrapper
Downloading/unpacking virtualenvwrapper
  Downloading virtualenvwrapper-4.2.tar.gz (125kB): 125kB downloaded
  Running setup.py (path:/tmp/pip_build_root/virtualenvwrapper/setup.py) egg_info for package virtualenvwrapper
    
    Installed /tmp/pip_build_root/virtualenvwrapper/pbr-0.5.23-py2.6.egg
    [pbr] Processing SOURCES.txt
    warning: LocalManifestMaker: standard file '-c' not found
    warning: no previously-included files found matching '.gitignore'
    warning: no previously-included files found matching '.gitreview'
    warning: no previously-included files matching '*.pyc' found anywhere in distribution
    warning: no files found matching '*.html' under directory 'docs'
    warning: no files found matching '*.css' under directory 'docs'
    warning: no files found matching '*.js' under directory 'docs'
    warning: no files found matching '*.png' under directory 'docs'
Requirement already satisfied (use --upgrade to upgrade): virtualenv in /usr/lib/python2.6/site-packages (from virtualenvwrapper)
Downloading/unpacking virtualenv-clone (from virtualenvwrapper)
  Downloading virtualenv-clone-0.2.4.tar.gz
  Running setup.py (path:/tmp/pip_build_root/virtualenv-clone/setup.py) egg_info for package virtualenv-clone
Downloading/unpacking stevedore (from virtualenvwrapper)
  Downloading stevedore-0.13.tar.gz (760kB): 760kB downloaded
  Running setup.py (path:/tmp/pip_build_root/stevedore/setup.py) egg_info for package stevedore
    
    Installed /tmp/pip_build_root/stevedore/pbr-0.5.23-py2.6.egg
    [pbr] Processing SOURCES.txt
    warning: LocalManifestMaker: standard file '-c' not found
    warning: no previously-included files found matching '.gitignore'
    warning: no previously-included files found matching '.gitreview'
    warning: no previously-included files matching '*.pyc' found anywhere in distribution
    warning: no files found matching '*.py' under directory 'tests'
Downloading/unpacking argparse (from stevedore->virtualenvwrapper)
  Downloading argparse-1.1.zip (151kB): 151kB downloaded
  Running setup.py (path:/tmp/pip_build_root/argparse/setup.py) egg_info for package argparse
Installing collected packages: virtualenvwrapper, virtualenv-clone, stevedore, argparse
  Running setup.py install for virtualenvwrapper
    [pbr] Reusing existing SOURCES.txt
    changing mode of build/scripts-2.6/virtualenvwrapper.sh from 644 to 755
    changing mode of build/scripts-2.6/virtualenvwrapper_lazy.sh from 644 to 755
    Skipping installation of /usr/lib/python2.6/site-packages/virtualenvwrapper/__init__.py (namespace package)
    Installing /usr/lib/python2.6/site-packages/virtualenvwrapper-4.2-py2.6-nspkg.pth
    changing mode of /usr/bin/virtualenvwrapper.sh to 755
    changing mode of /usr/bin/virtualenvwrapper_lazy.sh to 755
  Running setup.py install for virtualenv-clone
    Installing virtualenv-clone script to /usr/bin
  Running setup.py install for stevedore
    [pbr] Reusing existing SOURCES.txt
  Running setup.py install for argparse
Successfully installed virtualenvwrapper virtualenv-clone stevedore argparse
Cleaning up...

環境設定を行う。今回はbashを使っているので、.bashrc中に公式HPの解説に従い以下の様な設定を追加した。

export WORKON_HOME=$HOME/.virtualenvwrapper.workons
export PROJECT_HOME=$HOME/.virtualenvwrapper.projects
source /usr/bin/virtualenvwrapper.sh

公式HPの例から修正している点:

  • ディレクトリを".virtualenv"ではなく、wrapperであることを明示できるよう ".virtualenvwrapper" に修正。また、workonとprojectでディレクトリ名から推測できるよう調整。
  • 公式HP例では "/usr/local/bin/virtualenvwrapper.sh" だったが、今回のインストールでは "/usr/bin/virtualenvwrapper.sh" としてインストールされたので、sourceするパスを修正。

実際に環境を追加してみる。

[...]$ mkvirtualenv test1
New python executable in test1/bin/python
Installing setuptools, pip...done.
# →作成後、その環境に切り替わる。実体はvirtualenvで、プロンプト($PS1)も変更される。

(test1)[...]$ workon
test1

(test1)[...]$ python
Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.path
['', '/home/msakamoto/.virtualenvwrapper.workons/test1/lib64/python26.zip', (...)]
# → ".virtualenvwrapper.workons" 以下に "test1" というvirtualenvが作成され、
# その中のディレクトリが sys.path 以下に設定されたことが確認できた。

(test1)[...]$ echo $PATH
/home/msakamoto/.virtualenvwrapper.workons/test1/bin:/usr/lib64/qt-3.3/bin:(...)

環境を戻すには、"deactivate"コマンドを実行する。(実体はvirtualenvなので、それと同じ)

(test1)[...]$ deactivate
[...]$ 

手動でPythonインタープリタをインストール(インストール先を分離)

Pythonインタープリタを専用のディレクトリにインストールしたい場合、configure時に"--prefix"オプションでインストール先を設定する。
注意点:

  • zlibなど開発系のライブラリをインストールしておかないと、対応する機能がOFFの状態でビルドされてしまう。
  • ディストリビューション提供のPythonとコンパイルオプションを合わせておきたい場合は、 Python/インタープリタがコンパイルされた時のコンパイルオプションを確認する などで予め "./configure" 時やコンパイル時のオプションを確認しておく。
  • ldconfigの設定などで、分離したインストール先の "lib/" を登録してライブラリがロードできるよう調整しておく。
    • Pythonのビルドでは、ありがたいことに "libpython2.7.so.1.0" のようにメジャー番号とマイナー番号がsoのファイル名に含まれない。このため、システムにインストール済みのものとマイナー番号が異なれば、(多分)システム側のPython実行環境と衝突する心配はない。
    • 安全を期すのであればシステムのldconfigではなく、実行ユーザー環境でのLD_LIBRARY_PATHを調整すればよい。

ちなみに、開発系のライブラリが見つからない場合、make時に以下のように、「こんなモジュールがOFFになりました」と一覧で出してくれるので、適宜調べて、対応すればよい。

Python build finished, but the necessary bits to build these modules were not found:
_curses            _curses_panel      _sqlite3        
_ssl               _tkinter           bsddb185        
bz2                dl                 imageop         
readline           sunaudiodev        zlib            
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

今回の実験ではtcl/tk関連、dl, bsddb関連, imageop はまず使わないのでスルーした。CentOS6だったので、以下の開発用パッケージをインストールした。

# yum install zlib-devel bzip2-devel sqlite-devel ncurses-devel \
       openssl-devel gdbm-devel readline-devel

実際にビルドしてみる。まずインストール先のディレクトリを作成する。

$ mkdir -p /work/pythonbuilds/2.7.6

"./configure" & makeを実行する。"--prefix"以外は、ディストリビューションインストール済みのPython2.6で確認したオプションとなる。

$ ./configure --prefix=/work/pythonbuilds/2.7.6 --enable-ipv6 --enable-unicode=ucs4 --enable-shared
$ make

make後のインストールだが、"make install"の他に"make altinstall"というmakeターゲットが使える。
Makefileより関連の説明箇所を抜粋:

...
# If you have a previous version of Python installed that you don't
# want to overwrite, you can use "make altinstall" instead of "make
# install".  Refer to the "Installing" section in the README file for
# additional details.
#
# See also the section "Build instructions" in the README file.
...
# Install everything
install:         altinstall bininstall maninstall 

# Install almost everything without disturbing previous versions
altinstall:      altbininstall libinstall inclinstall \
                                libainstall altmaninstall \
                sharedinstall oldsharedinstall 
...

詳細は、READMEの "Installing multiple versions" セクションを確認のこと。

大雑把にまとめると、"make altinstall" では "bin/python" などバージョン番号なしのpython関連リンク・ディレクトリを作成しない。基本的にはメジャー.マイナーまでの番号付きのディレクトリやファイルを生成する。このため、システムにインストール済みのPythonと同じディレクトリツリーにインストールしても、上書きしてしまう心配は無い。

"./configure" で "--prefix" オプション無しであれば "make altinstall" も有効な選択肢に入るだろうが、今回については"--prefix"オプションを付けて完全にディレクトリを分離するアプローチを採っている。このため、 "make altinstall" ではなく普通に "make install" を実行する。

参考として、今回の例で "make altinstall" すると"bin/"以下には次のファイルがインストールされた。

"make altinstall" 後:

$ ls
2to3*  idle*  pydoc*  python2.7*  python2.7-config*  smtpd.py*

"make install" 後:

$ ls -l
total 48
-rwxrwxr-x. 1 msakamoto   115 Jan 18 20:16 2to3*
-rwxrwxr-x. 1 msakamoto   113 Jan 18 20:16 idle*
-rwxrwxr-x. 1 msakamoto    98 Jan 18 20:16 pydoc*
lrwxrwxrwx. 1 msakamoto     7 Jan 18 20:41 python -> python2*
lrwxrwxrwx. 1 msakamoto     9 Jan 18 20:41 python2 -> python2.7*
-rwxr-xr-x. 1 msakamoto  9760 Jan 18 20:39 python2.7*
-rwxr-xr-x. 1 msakamoto  1688 Jan 18 20:41 python2.7-config*
lrwxrwxrwx. 1 msakamoto    16 Jan 18 20:41 python2-config -> python2.7-config*
lrwxrwxrwx. 1 msakamoto    14 Jan 18 20:41 python-config -> python2-config*
-rwxrwxr-x. 1 msakamoto 18561 Jan 18 20:16 smtpd.py*

インストールされたバイナリを実行すると、"libpython2.7.so.1.0"が見つからないと怒られる。lddコマンドでロードするライブラリを確認してみると、たしかにそれだけ "not found" となる。これは、ディレクトリを分離して専用の"lib/"にインストールされたため、システム側の共有ライブラリのローダがライブラリを見つけられないことが原因である。

$ ldd /work/pythonbuilds/2.7.6/bin/python2.7
	linux-vdso.so.1 =>  (0x00007fffd5dff000)
	libpython2.7.so.1.0 => not found
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003858c00000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003858400000)
	libutil.so.1 => /lib64/libutil.so.1 (0x0000003865000000)
	libm.so.6 => /lib64/libm.so.6 (0x0000003859800000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003858800000)
	/lib64/ld-linux-x86-64.so.2 (0x0000003858000000)

Linuxの場合、共有ライブラリのローダであるldの設定を変更する。一般的には "/etc/ld.so.conf" であるが、CentOS6の場合はその実体は "/etc/ld.so.conf.d" 内の個別設定ファイルをIncludeするだけとなっている。今回はその流儀に従い、"/etc/ld.so.conf.d/" 内に設定ファイルを追加する。

# cd /etc/ld.so.conf.d/
# echo "/work/pythonbuilds/2.7.6/lib" > py27.conf

設定ファイルを追加したら、ldconfigを実行して設定をリロードする。

# ldconfig

これでライブラリのロードに成功し、実行できるようになる。

$ ldd /work/pythonbuilds/2.7.6/bin/python2.7
	linux-vdso.so.1 =>  (0x00007fff11977000)
	libpython2.7.so.1.0 => /work/pythonbuilds/2.7.6/lib/libpython2.7.so.1.0 (0x00007fa91867a000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003858c00000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003858400000)
	libutil.so.1 => /lib64/libutil.so.1 (0x0000003865000000)
	libm.so.6 => /lib64/libm.so.6 (0x0000003859800000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003858800000)
	/lib64/ld-linux-x86-64.so.2 (0x0000003858000000)

実行してみる:

$ /work/pythonbuilds/2.7.6/bin/python2.7
Python 2.7.6 (default, Jan 18 2014, 20:36:47) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> for k in sys.path:
...     print k
... 

/work/pythonbuilds/2.7.6/lib/python27.zip
/work/pythonbuilds/2.7.6/lib/python2.7
/work/pythonbuilds/2.7.6/lib/python2.7/plat-linux2
/work/pythonbuilds/2.7.6/lib/python2.7/lib-tk
/work/pythonbuilds/2.7.6/lib/python2.7/lib-old
/work/pythonbuilds/2.7.6/lib/python2.7/lib-dynload
/work/pythonbuilds/2.7.6/lib/python2.7/site-packages

これでシステム以外のPythonが使えるようになったので、このPythonインタープリタを使う設定で virtualenv で分離環境を作成してみる。

手動でインストールしたPythonを使う virtualenv 環境の作成

virtualenvコマンドには "--python" という、作成する環境で使用するPython実行ファイルを指定するコマンドラインオプションがある。

$ virtualenv --python=/work/pythonbuilds/2.7.6/bin/python2.7 TEST2

これで "TEST2" の環境に入ると、pythonコマンドとして /work/pythonbuilds/2.7.6/bin/python2.7 を使うよう調整される。

$ virtualenv --python=/work/pythonbuilds/2.7.6/bin/python2.7 TEST2
Running virtualenv with interpreter /work/pythonbuilds/2.7.6/bin/python2.7
New python executable in TEST2/bin/python2.7
Also creating executable in TEST2/bin/python
Installing setuptools, pip...done.

$ source ./TEST2/bin/activate
(TEST2)[...]$ 

(TEST2)[...]$ python
Python 2.7.6 (default, Jan 18 2014, 20:36:47) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> for k in sys.path:
...     print k
... 

/home/msakamoto/work/TEST2/lib/python27.zip
/home/msakamoto/work/TEST2/lib/python2.7
/home/msakamoto/work/TEST2/lib/python2.7/plat-linux2
/home/msakamoto/work/TEST2/lib/python2.7/lib-tk
/home/msakamoto/work/TEST2/lib/python2.7/lib-old
/home/msakamoto/work/TEST2/lib/python2.7/lib-dynload
/work/pythonbuilds/2.7.6/lib/python2.7
/work/pythonbuilds/2.7.6/lib/python2.7/plat-linux2
/work/pythonbuilds/2.7.6/lib/python2.7/lib-tk
/home/msakamoto/work/TEST2/lib/python2.7/site-packages

virtualenvwrapperでも、mkvirtualenvにvirtualenvコマンドのコマンドラインオプションを渡せるので、以下のようにPythonインタープリタ実行ファイルを指定して環境を作成できる。

$ mkvirtualenv --python=/work/pythonbuilds/2.7.6/bin/python2.7 py27t1
Running virtualenv with interpreter /work/pythonbuilds/2.7.6/bin/python2.7
New python executable in py27t1/bin/python2.7
Also creating executable in py27t1/bin/python
Installing setuptools, pip...done.

(py27t1)[...]$ which python
~/.virtualenvwrapper.workons/py27t1/bin/python

(py27t1)[...]$ ldd `which python`
	linux-vdso.so.1 =>  (0x00007fff4316f000)
	libpython2.7.so.1.0 => /work/pythonbuilds/2.7.6/lib/libpython2.7.so.1.0 (0x00007f436b37c000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003858c00000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003858400000)
	libutil.so.1 => /lib64/libutil.so.1 (0x0000003865000000)
	libm.so.6 => /lib64/libm.so.6 (0x0000003859800000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003858800000)
	/lib64/ld-linux-x86-64.so.2 (0x0000003858000000)

(py27t1)[...]$ echo $PATH
/home/msakamoto/.virtualenvwrapper.workons/py27t1/bin:/usr/lib64/qt-3.3/bin:(...)

(py27t1)[...]$ python
Python 2.7.6 (default, Jan 18 2014, 20:36:47) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> for k in sys.path:
...   print k
... 

/home/msakamoto/.virtualenvwrapper.workons/py27t1/lib/python27.zip
/home/msakamoto/.virtualenvwrapper.workons/py27t1/lib/python2.7
/home/msakamoto/.virtualenvwrapper.workons/py27t1/lib/python2.7/plat-linux2
/home/msakamoto/.virtualenvwrapper.workons/py27t1/lib/python2.7/lib-tk
/home/msakamoto/.virtualenvwrapper.workons/py27t1/lib/python2.7/lib-old
/home/msakamoto/.virtualenvwrapper.workons/py27t1/lib/python2.7/lib-dynload
/work/pythonbuilds/2.7.6/lib/python2.7
/work/pythonbuilds/2.7.6/lib/python2.7/plat-linux2
/work/pythonbuilds/2.7.6/lib/python2.7/lib-tk
/home/msakamoto/.virtualenvwrapper.workons/py27t1/lib/python2.7/site-packages

参考資料

altinstall関連:

pyenv

2014-01版:今回はpyenvまで時間が取れなかったため検証せず。ざっくりググった参考資料のリンクだけ載せるに留める。

pyenvを使うと、どうせならvirtualenvと連動させたいよね、ということで:

pyenvの検証をスルーした理由の一つに、pyenvがPythonのソースをDLしてコンパイルするというのであれば、コンパイルオプションの調整にまた一手間かかってしまうだろうな~というのがあった。つまり実用性とか、地雷回避性能に疑問符がついてしまったため、スルー。

番外:Mac OSX編

感想

Pythonの複数バージョンを共存させたい場合、もう一つ観点として付け足したいのが、利用するのが誰か、という点。

  • 自力でのトラブル解決を期待できる、開発者向けか?
  • 基本的にマニュアル操作で、開発者のサポートが無くても日常的に作業する運用者向けか?
  • サーバサイドアプリか?

この観点でベターな方式を考えると、pyenvやvirtualenvwrapperは、運用者やサーバサイドアプリ向けにはオーバースペックに思える。このユースケースでは、そもそも「新しい分離環境を作成」する必要は全くなく、既にセットアップ済みの分離環境を使うのみとなるからだ。virtualenv単体であれば、環境変数を設定するタイミングで(bashなら)sourceで分離環境の "bin/activate" を取り込むだけなので、サーバサイドアプリの起動用スクリプトにも組み込み易い。ディレクトリも好きな場所に設置できるので、例えばroot権限で環境を作成し、運用者権限を分ければ、運用者が誤って分離環境を壊してしまうような事故も防止できるだろう。

一方で開発者視点では、環境の切り替え作業が日常的に増えるため、virtualenv単体ではやや力不足であり、virtualenvwrapperがベターなアプローチだろう。Pythonインタープリタ自体の異なるバージョンの共存については、共存させるバージョンの数が数個であればvirtualenv(wrapper) + 手動ビルドでも問題ないだろう。5個以上になり、頻繁に切り替える必要が生じたり、あるいは最新のリリースへのキャッチアップが要求されるようであれば、pyenvのように自動DL&ビルドしてくれる環境管理ツールが有効だろう。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2014-01-19 12:24:32
md5:68064168b8caca8365641da300b00136
sha1:f690db10553d071f8c826da8bc280c42dd475350
コメント
コメントを投稿するにはログインして下さい。