Edited at

pythonバージョン管理システムがよくわからない人のための環境構築手順

More than 1 year has passed since last update.


環境


  • 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などに次の設定を追加します。


.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.123.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かわからないと言われる


うまくいかない時

この辺が原因かもしれない。


参考