概要
最近はデータ分析などのためにPython環境を手っ取り早く構築する際にAnacondaがよく使われているようです。
Anacondaおよびそれを最小構成にしたMinicondaでは、付属のパッケージマネージャcondaを用いてPython本体を含む環境全体を管理することができます。
従来のPython開発では、次のように用途に応じて個別のツールを使い環境を構築することが必要でした。
- pip: パッケージの管理
- virtualenv | venv: 複数のパッケージを含む環境の管理
- pyenv: Python本体の管理
Anaconda/Minicondaではこれらをcondaのみで行うことが可能です。
-
conda create
でPython本体を含めた環境を作成 -
conda install
でパッケージを追加
チーム開発を行っていたり、成果物を本番サーバで稼働させるような場面では、構築した環境を別のマシンで素早く再構築できると便利です。
pip, pyenvを用いる場合はそれぞれ requirements.txt
, .python-version
のようなファイルを用意することでライブラリやPython本体のバージョンを管理していました。
condaでは、環境設定をYAML形式で書き出すことで、そこから簡単に環境を再構築することができます。
以下ではその詳細な方法を解説します。
Miniconda のインストール
Anacondaは多数のメジャーなパッケージを含めたオールインワンのプラットフォームですが、今回のようにプロジェクト毎に必要最小限の環境を構築したい場合はMinicondaを用いるほうがスマートです。
Minicondaのインストール方法はこちらに記載の通り、ダウンロードしたインストーラを起動すれば開始します。
$ bash Miniconda2-latest-MacOSX-x86_64.sh
Macの場合は、brew caskでもインストールできます。
$ brew install Caskroom/cask/miniconda
以下ではMinicondaがインストール済みであり、condaをはじめとする各コマンドにPATHが通っている状態を想定しています。
環境の構築
ここではmyenvという名前でPython3.5の環境を作成してみます。
condaではPython本体とパッケージを環境の構成要素として同等に扱うため、パッケージも同時にインストールすることができます。
$ conda create --name myenv python=3.5 numpy=1.11.1
作成した環境を有効化します。
$ source activate myenv
追加でパッケージをインストールすることもできます。
$ conda install scipy
PyPIに登録されている全てのパッケージがcondaでインストールできるわけではありません。
condaでインストールできないパッケージは、従来通りpipでインストールすることが可能です。
pipはcondaで作成した環境に最初から入っています。
$ pip install peewee
環境設定の書き出しと再利用
環境を有効化済みの状態で conda env export
を実行することで、環境設定をYAML形式で書き出すことができます。
$ conda env export > myenv.yaml
書き出されたファイルは以下のようになります。
pipでインストールしたパッケージも正しくexportされています。
name: myenv
dependencies:
- mkl=11.3.3=0
- numpy=1.11.1=py35_0
- openssl=1.0.2h=1
- pip=8.1.2=py35_0
- python=3.5.1=5
- readline=6.2=2
- scipy=0.17.1=np111py35_1
- setuptools=23.0.0=py35_0
- sqlite=3.13.0=0
- tk=8.5.18=0
- wheel=0.29.0=py35_0
- xz=5.2.2=0
- zlib=1.2.8=3
- pip:
- peewee==2.8.1
このファイルさえあれば、別のマシンで同じ環境を簡単に再構築することができます。
$ conda env create --file myenv.yaml
環境設定ファイルを自分で書く
exportによって書き出された環境設定ファイルには、意図してインストールしたパッケージの依存関係によってインストールされたパッケージも含まれてしまいます。
プロジェクトの構成として直接的に使用するライブラリのみを明示したい場合は、設定ファイルを自分で書く必要があります。
name: myenv
dependencies:
- python=3.5.1
- numpy=1.11.1
- scipy=0.17.1
- pip:
- peewee==2.8.1
おすすめは、RubyのBundlerにおける Gemfile
, Gemfile.lock
に倣い、 myenv.yaml
には直接的に使用するライブラリのみを記述しておき、これを用いて作成した環境をexportして myenv.frozen.yaml
のような名前で保存するという方法です。
こうしておけば、myenv.yaml
を見ればプロジェクトで直接使用するパッケージを把握でき、 myenv.frozen.yaml
を使えば依存パッケージを含めて全く同じ環境を再構築することができます。