pyenvとvirtualenvで環境構築

  • 575
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

自分の環境を構築する方法のメモ

リモートで作業する時に必要になったのでメモる
参考にしたサイトの方がわかりやすい可能性あり
環境は、mac OSX: Yosemite です。

pyenv

pyenvはpython環境を管理するものです。
標準とは違う環境のpython環境を作成できます。

参考URL:
pyenvおよびvirtualenvの使い方
pyenvでPython環境を管理する方法
pyenvとvirtualenvを使ってみる

説明とか読みたくない人(知識のある人)

https://github.com/KodairaTomonori/Qiita/blob/master/shell/construct_pyenv.sh
これをコピーして、実行するとホームに環境が構築される
ホーム以外に構築したい場合は、~/の部分を任意のpathに書き換えたらできます。
※~/.bash_profileに追加書き込みされます。

pyenvを使えるようにする

まず、git cloneする
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

そして、下記のものを~/.bash_profileに書き込む。(.bashrc, .bash_profileについて:本当に正しい .bashrc と .bash_profile の使ひ分け

export PYENV_ROOT=\$HOME/.pyenv
export PATH=\$PYENV_ROOT/bin:\$PATH
eval "\$(pyenv init -)"

それぞれのバージョンのpythonのインストール

pyenv install 3.5.0でインストールできます。バージョンは任意となります。

install-version.
$ pyenv install 3.5.0
$ pyenv install 2.7.9

間違えた時のアンインストール方法は、installuninstallに変えて実行。

pythonのバージョンの切り替え

pyenv global x.x.xまたは、pyenv local x.x.xでバージョンの切り替えができます。
globalとすると全体に、localにするとそのカレントディレクトリに反映されます。この反映はterminalを終了しても続くので、localでフォルダごとに設定するととても便利です。

そのシェルでの変更は、shellとすると、変更できます。これを使用した場合、今使用してるシェルでしかその環境が反映されません。なので、シェルを閉じた時後に再度開いた場合やシェルを複数開いた場合は、その環境変更は他に影響されることはありません。

一時的に使う場合はshell、フォルダごとに設定したい場合はlocal、全体のデフォルトの環境を変えたい場合はglobalといったところでしょうか。

x.x.xの部分をsystemとすることで元に戻せます。

swich-python-version.
python --version
Python 2.7.3

$ pyenv shell 2.7.9
$ python --version
Python 2.7.9

$ pyenv shell 3.5.0
$ python --version
Python 3.5.0

$ pyenv shell system
$ python --version
Python 2.7.3

moduleのインストール

インストールしたpython(2.7.9と3.5.0)には、デフォルトのモジュールしか入ってない(pip freezeしても何も入ってない)のでインストールします。
モジュールを入れるのは、通常通りpip installで任意のモジュールを入れるだけです。

pip install xxxxx

virtualenv

pyenvだけでも、十分便利だけど、もっと便利に。
virtualenvは、同じ(python)バージョンで違う環境を作成するためのもの

インストール方法

$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

そして、設定を.bash_profileに書き込む

eval "$(pyenv virtualenv-init -)"

新しい環境の作成

新しいpython環境の作成は、pyenv virtualenv [version] <virtualenv-name>とすることで新しくvirtualenv-nameという環境ができる。ここの[version]には、既存の環境を指定する。

make_new.
pyenv virtualenv 3.5.0 new_3.5.0

ここで、新しく作った環境では、pyenvで作った環境の中でpip等でインストールしたモジュールは使えなくなっている。
[version]で使ってたものを使いたければ、--system-site-packageというオプションをつける。
そうすると、pyenvで構築したもののsite-packagesにパスを通します。

下記の例でいうと、--system-site-packagesをつけると、~/.pyenv/versions/3.5.0/lib/python3.5/site-packagesがパスに加わるということです。

sample_site-packages.
$ pyenv virtualenv 3.5.0 inde-3.5.0
$ pyenv virtualenv --system-site-packages 3.5.0 co-3.5.0
$ pyenv virtualenv --system-site-packages inde-3.5.0 co-inde-3.5.0

# sys.path一部省略しています。
$ python -c 'import sys; print(sys.path)'    # ここは、3.5.0
['', '~/.pyenv/versions/3.5.0/lib/python35.zip',..., '~/.pyenv/versions/3.5.0/lib/python3.5/site-packages']

(inde-3.5.0) $ python -c 'import sys; print(sys.path)'
['', '~/.pyenv/versions/3.5.0/lib/python35.zip', .... , '~/.pyenv/versions/inde-3.5.0/lib/python3.5/site-packages']

(co-3.5.0) $ python -c 'import sys; print(sys.path)'
['', '~/.pyenv/versions/3.5.0/lib/python35.zip', ... , '~/.pyenv/versions/co-3.5.0/lib/python3.5/site-packages', '~/.pyenv/versions/3.5.0/lib/python3.5/site-packages']

(co-inde-3.5.0)kodaira@fomalhaut:~$ python -c 'import sys; print(sys.path)'
['', '~/.pyenv/versions/co-inde-3.5.0/lib/python35.zip',  ... , '~/.pyenv/versions/co-inde-3.5.0/lib/python3.5/site-packages', '~/.pyenv/versions/3.5.0/lib/python3.5/site-packages']

他の環境のmoduleをインストールしたい時は、pip freezeをどっかに書き込んで、pip install -rでインストールできます。(virtualenvする時にコピーする方法ありそうだったけど見つからなかったので誰か。。。)

pip_install.
---コピーしたい環境で----
$ pip freeze > pyp_list.txt
---環境変更後----
$ pip install -r pyp_list.txt

virtualenv環境の保存と再構築

ここが、一番virtualenvを使う利点だと思います。
環境を保存して、他の場所で同じ環境を再現する話です。

まず、必要なもの(wheel)をインストール

install_wheel.
$ pyenv exec pip install wheel

wheelを使ってpipでインストールしたモジュールの情報を保存

--wheel-dir=[dir]で任意のディレクトリに保存
上で、pip freezeの出力をそのまま使いましたが、wheelを使った方がいいらしいです。

save_module_info.
$ pyenv exec pip freeze > pyp_list.txt
$ pyenv exec pip wheel --wheel-dir=~/tmp/wheelhouse -r pyp_list.txt

新しい、環境を作ったところでさっき作ったwheel使って同じものをインストール

wheelすることで、ビルド済みのパッケージを保存できるので、毎回コンパイルせずに済む。
参考URL:そこはかとなく書くよん。

install_using_wheel.
$ pyenv virtualenv 3.5.0 tes-3.5
$ pyenv global tes-3.5
$ pip install -r pyp_list.txt --use-wheel --no-index --find-links=tmp/wheelhouse
$ pip freeze

まとめ

pyenvvirtualenvを使うことによって環境を構築できる。
'wheel'で環境を保存でき、他の場所で同じ環境を再現できる。

間違ってるあるとか、もっと便利なのあるとかあったら教えてください