最近、Webスクレイピングや機械学習を勉強するのに、Pythonを使うことが多いのですが、書籍やWebの情報によっては、Pythonの2系で動くコードだったり、3系で動くコードが混在していたしまします。また、サンプルを動かしてみるのに、pipでパッケージをインストールしますが、それらを繰り返していると、「site-packages」配下に多くのライブラリが配置され、依存関係からエラーが多くなってきてしまうこともあります。
このエントリでは、Pythonで2系と3系を混在させて使い分けたり、さらに仮想環境を使って「site-packages」を独立させて管理することで、きれいな状態の実行環境を作る方法について、自分なりに試行錯誤した結果をまとめとしてメモしておこうと思います。
なお、環境構築はWindows上で行いましたが、いくつかの情報はMacOSやLinuxでも通用するかと思います。
Python2系と3系など、複数バージョンのPythonを使い分けるための環境構築
複数のバージョンのpythonを使い分けるには、Python3.3から導入されたpy.exeランチャを使うと便利です。
はじめにpy.exeの仕組みを簡単に説明すると、OS上にインストールされた複数バージョンのpythonを起動するWrapperみたいに動作します。
- Python3.3以上をインストールすると、C:\Windows配下に「py.exe(とpyw.exe)」がコピーされる。
- .pyファイル名のキックか、pythonアイコンのダブルクリックにより、上記のpy.exeを通してpythonが起動される。
- py.exeが、pythonを起動する際に、OS上にインストールされている複数のpythonを自動で判別してくれる。
のように動くわけです。
Windows上で複数Pythonをインストールする際の手順です。今回は、Python3.6.0とPython2.7.13を対象としました
「https://www.python.org/downloads/」から2つのインストーラをダウンロードします。今回は、「python-3.6.0.exe」と「python-2.7.13.msi」でした。
最初にPython3系をインストールをインストールします。インストール時のオプションはデフォルトでOKです。注意点は「Add Python to environment variables」はチェックを外しておき、環境変数のPATHにこのバージョンのpython.exeが追加されないようにしておきます。
なお、このタイミングで、py.exeがWindowsフォルダ配下にコピーされていることが確認できると思います。
次に、2系をインストールします。
ほとんどデフォルトのオプションでOKですが、注意点は、以下のように「Register Extentions」を外すことです。 これがチェック入っていると、.pyファイルが実行されるときのpythonが上書きされてしまいます。
我々は、Windows配下にできたpy.exeをラッパーにして起動したいので、このオプションはチェックを入れないようにします。
コマンドラインから実行する場合は、
- py -2 my_py_file.py
- py -3 my_py_file.py
- py -2.7 my_py_file.py
- py -3.6 my_py_file.py
のように指定することができます。
どうしてpy -2やpy -3でインストールしているpythonのバージョンの2系や3系が適切に起動されるのか、不思議だと思う人もいるかもしれませんが、py.exeは、インストールされている各バージョンの最新版を自動で見つけてくれるからです。
試しに、複数のバージョンのpython(ver 3.4とver3.5)をインストールしてみると、「py -3」で新しい方のpython3.5が起動されるのが分かります。
この振る舞いを変えて、3.4の方を実行したい場合は、PY_PYTHON2 とPY_PYTHON3という環境変数を使います。
つまり、PY_PYTHON3=3.4と指定すれば、py -3で起動したときに、ver3.4が起動されるというわけです。
また、もし、2と3の2つのバージョンがインストールされている場合は、py.exeはver3系をデフォルトで起動します。 この振る舞いを変更して、デフォルトでver2系を起動したい場合は、PY_PYTHON=2をセットしておきます。(※PY_PYTHONはどちらのバージョンをデフォルトとして起動するかに使われる環境変数)
pyコマンドは、.pyファイルに記述されたシェバンも適切に解釈してくれます。ファイルの最初に以下のようなUnixのシェバンタイプの記述を行って起動するpythonのバージョンを指定することができるわけです。(従来はWindows環境では、このようなシェバン型の指定は無視されていました。)
#! python2
#! python3
#! /usr/bin/python2.7
#! /usr/bin/env python3.6
#! c:\Python36\python.exe
上記までのことをまとめると、今回の私のように、2.7.13 と3.6.0をインストールした場合は、#!/usr/bin/python で起動すると、ver3.6.0が起動されることになります。これを2.7.13で起動させたい場合は、以下のようにすればいいということですね。
- .pyファイルの最初に記述するシェバンを「#!/usr/bin/python2」にする。
- コマンドラインで「py -2 my_py_file.py」などとバージョン2指定でと打つ。
- PY_PYTHON環境変数を2にセットする。
仮想開発環境の構築
さて、バージョンの異なるpythonを切り替えて実行できるようにはなりましたが、さらに、同じバージョンのpythonの中でも管理するパッケージを切り分けて開発(実行)環境を作れるようになっていると、様々なライブラリを試すのに便利です。
Pythonでは、virtualなenvを管理するパッケージがあり、2系では「virtualenv」、最近の3系では「venv」が使われています。そこで、この章では、これらを使った仮想開発環境の作り方について整理します。
「virtualenv」や「venv」は、どちらも同じような仕組みで、「python venv <仮想開発環境名>」のようにすると、カレントディレクトリに<仮想開発環境名>でフォルダを作り、そこに、起動するバージョンのpython.exeやsite-packagesをコピーしてきます。環境を使う際には、ディレクトリに移動して、activateすると、Pathなどが特定のバージョンのpythonに上書きされるので、以降、そのバージョンのpythonを使うことができるわけです。また、pipなどでパッケージをインストールした場合でも、その仮想環境のディレクトリ配下の「site-packages」にライブラリがダウンロードされますので、依存関係が仮想環境ごとに独立しており、依存関係の汚れず、エラーが出にくいメリットがあります。
初めに、pipが使えるか確認しておきましょう。pipはpythonのパッケージ管理の仕組みで、Python 2.7.9以降、Python 3.4以降のバージョンにはデフォルトでインストールされています。
以下のコマンドでpipがインストールされているか確認しておきましょう。
C:\>py -3 -m pip -V
pip 9.0.1 from C:\Python36-32\lib\site-packages (python 3.6)
C:\>py -2 -m pip -V
pip 9.0.1 from C:\Python27\lib\site-packages (python 2.7)
上記のような実行結果ならインストールされていますが、インストールされていない場合は、
https://pip.pypa.io/en/latest/installing/
を参考に、「py -2 python get-pip.py」などを行ってください。(上記URLにget-pip.pyのダウンロードリンクもあります。
python2系ではvirtualenvを使って仮想環境を作りますので、pipでvirtualenvをインストールしておきます。
cd C:\Python27\Scripts
pip2.7 install virtualenv
のコマンドを打ちます。(py -2 -m pip install virtualenvのようにpyを使ってもいいですが、私は、念のため、ここだけは、実態のexeをキックしました。)
※なお、ここで
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe2 in position 17: ordinal not in range
といったエラーが出る場合は、デフォルトの文字コードを変更するとエラーが出なくなります。
やり方は、C:/Python27/Lib/site-packages 内に sitecustomize.py という名のファイルを作成して
import sys
sys.setdefaultencoding("cp932") # デフォルトのエンコーディングをshift-jisに変更
というコードを追記します。その後、コマンドプロンプトを再起動し、pip installコマンドを実行します。
新たな仮想環境を作るには、適当なディレクトリで
py -2 -m virtualenv <仮想環境名>
を実行します。すると、コマンドを実行したパスに仮想環境を作ったフォルダが出来上がります。
この中のScriptsフォルダに、activate.bat というバッチファイルがあるので、それを実行しましょう。
<仮想環境名>\Scripts\activate.bat
なお、仮想環境から離脱するには、Scriptsフォルダにあるdeactivate.batを実行します。
<仮想環境名>\Scripts\deactivate.bat
envも使い方はvirtualenvとほぼ一緒です。
py -3 -m venv <仮想環境名>
でカレントディレクトリに<仮想環境名>ができ、いろいろとファイルがコピーされます。
<仮想環境名>\Scripts\activate.bat
<仮想環境名>\Scripts\deactivate.bat
で仮想環境へ入ったり、出たりするところも同じですね。