一つのマシンで複数バージョンのPythonを共存させるメモ。
複数バージョンといっても、Pythonのインタープリタを共存させるのか、site-packages以下のライブラリ空間を共存させるのか、あるいはその両方か、でアプローチが変わる。
site-packages以下のライブラリ空間を共存させたい場合:
Pythonインタープリタを複数バージョン共存させたい場合:
なお、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は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', (...)] # 元に戻ってる。
他、参考:
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の例から修正している点:
実際に環境を追加してみる。
[...]$ 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インタープリタを専用のディレクトリにインストールしたい場合、configure時に"--prefix"オプションでインストール先を設定する。
注意点:
ちなみに、開発系のライブラリが見つからない場合、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 で分離環境を作成してみる。
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関連:
2014-01版:今回はpyenvまで時間が取れなかったため検証せず。ざっくりググった参考資料のリンクだけ載せるに留める。
pyenvを使うと、どうせならvirtualenvと連動させたいよね、ということで:
pyenvの検証をスルーした理由の一つに、pyenvがPythonのソースをDLしてコンパイルするというのであれば、コンパイルオプションの調整にまた一手間かかってしまうだろうな~というのがあった。つまり実用性とか、地雷回避性能に疑問符がついてしまったため、スルー。
Pythonの複数バージョンを共存させたい場合、もう一つ観点として付け足したいのが、利用するのが誰か、という点。
この観点でベターな方式を考えると、pyenvやvirtualenvwrapperは、運用者やサーバサイドアプリ向けにはオーバースペックに思える。このユースケースでは、そもそも「新しい分離環境を作成」する必要は全くなく、既にセットアップ済みの分離環境を使うのみとなるからだ。virtualenv単体であれば、環境変数を設定するタイミングで(bashなら)sourceで分離環境の "bin/activate" を取り込むだけなので、サーバサイドアプリの起動用スクリプトにも組み込み易い。ディレクトリも好きな場所に設置できるので、例えばroot権限で環境を作成し、運用者権限を分ければ、運用者が誤って分離環境を壊してしまうような事故も防止できるだろう。
一方で開発者視点では、環境の切り替え作業が日常的に増えるため、virtualenv単体ではやや力不足であり、virtualenvwrapperがベターなアプローチだろう。Pythonインタープリタ自体の異なるバージョンの共存については、共存させるバージョンの数が数個であればvirtualenv(wrapper) + 手動ビルドでも問題ないだろう。5個以上になり、頻繁に切り替える必要が生じたり、あるいは最新のリリースへのキャッチアップが要求されるようであれば、pyenvのように自動DL&ビルドしてくれる環境管理ツールが有効だろう。
コメント