condaによるポータブルなPython環境構築のすすめ

  • 75
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

概要

最近はデータ分析などのために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されています。

myenv.yaml
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によって書き出された環境設定ファイルには、意図してインストールしたパッケージの依存関係によってインストールされたパッケージも含まれてしまいます。
プロジェクトの構成として直接的に使用するライブラリのみを明示したい場合は、設定ファイルを自分で書く必要があります。

myenv.yaml
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 を使えば依存パッケージを含めて全く同じ環境を再構築することができます。

参考