943
896

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pyenv と pyenv-virtualenv で環境構築

Last updated at Posted at 2015-10-29

##自分の環境を構築する方法のメモ
リモートで作業する時に必要になったのでメモる
参考にしたサイトの方がわかりやすい可能性あり
環境は、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 -)"

* 2020/03/17 修正:ダブルクウォート追加

##それぞれのバージョンの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

#pyenv-virtualenv
pyenvだけでも、十分便利だけど、もっと便利に。
pyenv-virtualenvは pyenv のプラグインで、同じ(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でインストールできます。(pyenv virtualenv する時にコピーする方法ありそうだったけど見つからなかったので誰か。。。)

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

##仮想環境の保存と再構築
ここが一番 pyenv-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

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

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

943
896
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
943
896

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?