環境
- macOS Sierra version 10.12.1
- Python 2.7.10
前提
- homebrewがインストールされていること
pyenvとvirtualenvとpyenv-virtualenv
pythonの環境を整えるに当たって、pythonのバージョン管理について調べていたのですが、virtualenvとpyenv-virtualenvでだいぶ混乱していました。
そんな時に見つけたのがこの記事です。大変わかりやすくスッキリしました。
自分でもまとめてみます。
pyenv-virtualenvとvirtualenvは別物であり、組み合わせは次の2通りが考えられる。
- pyenv + pyenv-virtualenv
- pyenv + virtualenv
例えばprojectA,projectB,projectCで別々のpython環境を使いたい時に、pyenv-virtualenvを使った場合は環境が3つともHOMEディレクトリに作られ、それを各々のプロジェクトから参照する。virtualenvを使った場合は、python環境は各プロジェクト内に作られる。という事だと思う。
virtualenvはプロジェクトのディレクトリで完結していて良いが、毎度環境をactiveにしないといけないのが面倒。
pyenv-virtualenvはプロジェクトディレクトリに入ったら自動的に環境が適用されるから楽だけど、環境がHOMEディレクトリ配下に作られるのがちょっと気持ち悪い。だって別のプロジェクトから同じ環境を使いたいことってあんまりないでしょ。
というわけで、pyenv + virtualenvを使うことにした。
pyenv
pyenvのインストール
homebrewでpyenvをインストールします。
$ brew install pyenv
.bash_profile
などに次の設定を追加します。
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
別バージョンのインストール
pythonの最新バージョンをインストールしてみます。
pyenv install -l
でインストール可能なバージョンの一覧を確認できます。2系と3系の最新バージョンをインストールしてみます。
$ pyenv versions
* system (set by /Users/clutter/.pyenv/version)
$ pyenv install -l
$ pyenv install 2.7.12
$ pyenv install 3.5.2
$ pyenv versions
* system (set by /Users/clutter/.pyenv/version)
2.7.12
3.5.2
2.7.12
と3.5.2
がインストールできました。
バージョンの切り替え
pyenvでバージョン切り替えてみます。
~$ pyenv version
system (set by /Users/clutter/.pyenv/version)
~$ python -V
Python 2.7.10
## globalバージョンの変更
~$ pyenv global 3.5.2
~$ pyenv version
3.5.2 (set by /Users/clutter/.pyenv/version)
~$ python -V
Python 3.5.2
## 特定ディレクトリでの変更
~$ mkdir pytest
~$ cd !$
pytest$ pyenv local 2.7.12
pytest$ pyenv version
2.7.12 (set by /Users/clutter/pytest/.python-version)
pytest$ python -V
Python 2.7.12
pytest$ cd ..
~$ pyenv version
3.5.2 (set by /Users/clutter/.pyenv/version)
~$ python -V
Python 3.5.2
homeディレクトリとpytestディレクトリでバージョンが切り替わっていることが確認できます。
localのバージョンは、そのディレクトリに作成される.python-version
に記録されているようです。
pytest$ ls -a
. .. .python-version
pytest$ cat .python-version
2.7.12
virtualenv
virtualenvのインストール
pyenvでインストールしたバージョンに切り替えるとpip
が使えるのでそれでインストールします。
$ pip install virtualenv
仮想環境の作成
仮想環境を作成して、Flaskをインストールしてみます。
$ pip list
pip (8.1.1)
setuptools (20.10.1)
virtualenv (15.1.0)
# 新しい仮想環境venvtestを作成
$ virtualenv venvtest
New python executable in /Users/clutter/venvtest/bin/python2.7
Also creating executable in /Users/clutter/venvtest/bin/python
Installing setuptools, pip, wheel...done.
$ ls
venvtest
$ cd venvtest
# 仮想環境を有効にする
$ source bin/activate
# 仮想環境でパッケージをインストール
(venvtest) $ pip install Flask
(venvtest) $ pip list
click (6.6)
Flask (0.11.1)
itsdangerous (0.24)
Jinja2 (2.8)
MarkupSafe (0.23)
pip (9.0.1)
setuptools (30.4.0)
Werkzeug (0.11.11)
wheel (0.29.0)
# 仮想環境を抜ける
(venvtest) $ deactivate
$ pip list
pip (8.1.1)
setuptools (20.10.1)
virtualenv (15.1.0)
仮想環境を抜けるとFlaskがインストールされていない事が確認できます。
仮想環境を作る時に--no-site-packages
をつけると、globalにインストールされたパッケージを無視して綺麗な状態で環境を作ってくれるらしいのでこのオプションは覚えておいた方が良さそう。
pythonのバージョンを指定して環境を作る場合
--python
オプションを指定して作成する
virtualenv venv --python=~/.pyenv/versions/3.5.2/bin/python3
--python=python3.5.2
としても良いが、anacondaもインストールされているとどっちのpython3かわからないと言われる
うまくいかない時
この辺が原因かもしれない。
-
.bash_profile
の設定が読み込まれていない - pythonがpyenvより先にPATHに設定されている