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