Python 仮想環境

Python は学びやすい上に、応用面も広い。そのため、様々なプロジェクトでは、プログラミング言語として Python を利用して開発している。これらのプロジェクトでは、同じバージョンの Python を利用しているとは限らない。そのため、一つのパソコン上で柔軟に Python のバージョンを切り替えることが、複数のプロジェクトを開発していく上で欠かせない。このように、一つのパソコン上で、複数の Python の仮想実行環境を構築し、自由に切り替えるようなツールとして、pyenv などがある。

pyenv

pyenv のインストール

pyenv をインストールするには、ターミナルで次のコマンドを実行する。コマンドを実行してから、ターミナルを再起動すると、pyenv が利用できるようになる。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile

pyenv の使い方

Python 仮想環境の構築

pyenv install コマンドに、インストールしたい Python のバージョンを指定する。例えば、Python 3.6.3 と Python 2.7.10 の 2 つのバージョンをインストールするには次のようにする。

pyenv install 3.6.3
pyenv install 2.7.10

このようにインストールされた Python の実体は、~/.pyenv/versions/ ディレクトリの下に保存される。

cd ~/.pyenv/versions
ls
## 2.7.10    3.6.3

また、pyenv install でインストールされた Python の仮想環境の一覧を表示するには、次のようにする。

pyenv versions
## * system (set by ~/.pyenv/version)
##   2.7.10
##   3.6.3

科学計算用のライブラリーなどがあらかじめインストールされた Python 開発環境である anaconda も pyenv でインストールすることができる。

pyenv install anaconda3-5.0.1
pyenv install anaconda-2.4.0

Python 仮想環境の切り替え

pyenv install で複数のバージョンの Python 仮想環境をインストールしたのち、必要に応じて、仮想環境(バージョン)を切り替えることができる。仮想環境の切り替えは、パソコン全体の仮想環境を切りける方法(global)と、特定のディレクトリの下のみで切り替える方法(local)と 2 つがある。

例えば、パソコン全体の Python 環境をバージョン 3.6.3 に切り替えるには、次のようにする。

pyenv global 3.6.3

また、例えば test ディレクトリ下だけの Python 環境をバージョン 2.7.10 に切り替えるには、次のようにする。

cd ./test
pyenv local 2.7.10

Python 仮想環境の削除

構築した Python 環境を削除するには、uninstall を利用する。

pyenv uninstall 2.7.10

virtualenv

pyenv では複数のバージョンの Python の仮想環境を構築し、互いに切り替えることができた。しかし、pyenv では、同じバージョンの Python 仮想環境を複数に構築することはできない。例えば、プロジェクト A と プロジェクト B の両方とも Python 2.7.10 を使う場合、二つのプロジェクトは同じ Python 仮想環境を利用することになる。つまり、プロジェクト A でインストールした様々な Python ライブラリーが、プロジェクト B でも利用できるように、混乱するもととなる。そこで、virtualenv プラグインをインストールすれば、同じバージョンの Python 仮想環境を複数個構築できるようになる。

virtualenv インストール

virtualenv をインストールするには、まず上述の pyenv をインストールする必要がある。次に、ターミナルで次のコマンドを実行して virtualenv をインストールする。

git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile

virtualenv の使い方

Python 仮想環境構築

新しい Python の開発仮想環境を構築するには pyenv virtualenv コマンドを利用する。例えば、プロジェクト A に Python 2.7.10 環境を構築し、プロジェクト B に Python 2.7.10 環境を構築し、プロジェクト C に Python 3.6.3 環境を構築する場合は、次のように実行すればいい。ただし、pyenv virtualenv コマンドを利用する前に、あらかじめ pyenv install を利用して、該当バージョンの Python をインストールしておく必要がある。

pyenv install 2.7.10
pyenv install 3.6.3

pyenv virtualenv 2.7.10 project_a
pyenv virtualenv 2.7.10 project_b
pyenv virtualenv 3.6.3 project_c

pyenv virtualenv を実行すると、~/.pyenv/versions/ ディレクトリにリンクが作成される。

cd ~/.pyenv/versions/
ls -l
## total 0
## drwxr-xr-x  7 user  staff  224 Nov 19 21:06 2.7.14
## drwxr-xr-x  7 user  staff  224 Nov 19 21:24 3.6.3
## lrwxr-xr-x  1 user  staff   51 Nov 19 21:06 project_a -> /home/user/.pyenv/versions/2.7.14/envs/project_a
## lrwxr-xr-x  1 user  staff   51 Nov 19 21:24 project_b -> /home/user/.pyenv/versions/2.7.14/envs/project_b
## lrwxr-xr-x  1 user  staff   50 Nov 19 21:24 project_c -> /home/user/.pyenv/versions/3.6.3/envs/project_c

仮想環境の切り替え

使い方は基本的に pyenv と同じである。pyenv に続いて、local か global を指定して、次にバージョンの代わりに、作成した仮想環境の名前を指定する。

mkdir project_a
cd project_a
pyenv local project_a

仮想環境の削除

作成した仮想環境を削除するには、プロジェクト名を指定して pyenv uninstall コマンドを利用する。

pyenv uninstall project_a
pyenv uninstall project_b
pyenv uninstall project_c

インストールエラー

pyevn を利用した仮想環境構築でよく見られるエラーとその対策方法をここに示す。

ssl module in Python is not avaiable

pip コマンドで Python のパッケージをインストールするとき「URL because the SSL module is not available.」などのエラーが表示されて、インストールできない場合がある。これは、pyenv で Python をインストールしたあとに MacOS の大型アップデートをしたり、brew で openssl に関連するパッケージのアップデートしたりすることに起因するエラーと思われる。対策として、OS または openssl アップデート前にインストールしてあった Python を削除してから、pyenv で再度インストールすると治る。

pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Collecting numpy
  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/numpy/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/numpy/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/numpy/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/numpy/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/numpy/
  Could not fetch URL https://pypi.org/simple/numpy/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/numpy/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
  Could not find a version that satisfies the requirement numpy (from versions: )
No matching distribution found for numpy
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping

References

  • pyenvとvirtualenvを使用してPythonの開発環境を構築する. UX MILK
  • a pyenv plugin to manage virtualenv (a.k.a. python-virtualenv). GitHub
  • Simple Python Version Management: pyenv. GitHub