conda と pip でのパッケージ管理について


Anaconda は一言でいうと Python 本体に加え科学計算のライブラリ等が最初から付属されているものです。またパッケージ管理とデプロイを簡略化するための工夫がなされており conda というパッケージ管理コマンドが付属しています。

conda と pip について

Python の世界ではかなり昔からそれ自体にパッケージ管理ツールというのが付属していて、昔は EasyInstall なるものを使っており pip を使うためにはあとからセットアップしなければならなかった。いちいち面倒であった。最近の Python ではすっかりデフォルトで pip が付属していて最高の時代になっている。このコマンドを使うと PyPI というサイトに公開しているパッケージをコマンドによりインターネット経由でインストールできる。最高の時代である。

さて、よくある話が conda と pip を併用すると「壊れる」という言説。なにをもって壊れると主張しているのかよくわかりませんが、そもそも同じパッケージに対し conda で入れたり pip で入れたりしている状況が異常なわけです。壊れているのはパッケージ管理システムではなくむしろ支離滅裂なことをやろうとしているあなたの頭ではないかと。

誤解を招かないように言っておきますが Anaconda では基本 conda というコマンドを打ってパッケージを入れるが pip を使うこともできる。前者の conda は Anaconda 社のリポジトリから入れる。後者の pip は PyPI から入れる。当然、後者のほうがたくさんパッケージがある。また PyPI は審査とかあるわけではないので、誰でもパッケージ作者になれる。極端な話、変なソースコードを書いて PyPI で公開しても、誰もチェックしていないのが現状である。自分のプロジェクトにしか使わないようなソースコードをパッケージ化して PyPI に置いても誰にも何とも言われない。

一方 Anaconda 社のリポジトリは一応会社が管理しているものなので、それなりにはチェックしているとは思うが別に自分は中の人ではないので「チェックしてます!」と保証するつもりはない。

またコミュニティが運営する conda-forge というリポジトリもあり、こちらから conda で入れることもできる。でもそれを使う時点で結局コミュニティの成果物じゃないか、とまあそんな感じです。

ぶっちゃけて言えば、パッケージとパッケージ間の依存関係なんて、作者の都合で依存しているものなので、 Python の世界全体を見渡してそれらの関係性を厳密に検証している人間なんていない。使うあなた次第ってことですね。

こういう議論は Python に限らずたとえば Ruby のパッケージ管理システムでも昔から議論になっていて、結局みんな好き勝手にパッケージを作っているのだからフリーダム。オープンソースなんてそんなもの。使う人が検証すればよろしいみたいな雰囲気になっているものと思う。

パッケージ間の依存関係を徹底的に検証して品質を維持しているのって Debian 安定版くらいのものじゃないか、と個人的には思っている。

pip での依存情報の表示

パッケージメンテナや作者は知っていると思いますが PyPI に登録するときにはパッケージの配布ファイルに色々メタ情報を書きます。

で、依存情報はどうやって調べるかというと、以下のコマンドで表示できます。

pip install pipdeptree # pip で入れる
pipdeptree -p <パッケージ名>

例えば pandas というパッケージについてバージョンごとにいくつか例を挙げるとこんな感じ。

pandas==0.16.2
  - numpy [required: >=1.7.0, installed: 1.11.2]
  - python-dateutil [required: >=2, installed: 2.6.0]
    - six [required: >=1.5, installed: 1.10.0]
  - pytz [required: >=2011k, installed: 2016.7]

pandas==0.22.0
  - numpy [required: >=1.9.0, installed: 1.13.3]
  - python-dateutil [required: >=2, installed: 2.6.1]
  - six [required: >=1.5, installed: 1.11.0]
  - pytz [required: >=2011k, installed: 2017.2]

これを見ればどのパッケージがどのパッケージのどのバージョンに依存しているのか把握できる。

conda と pip の両方で重複しているパッケージの表示

よくあるのが conda で管理しているのに、意図せず pip でも入れてしまうという事故。というわけで重複しているパッケージは以下のワンライナーで表示できます。

conda list | cut -d ' ' -f 1 | sort | uniq -d

たまにチェックして重複していないか確認しておくと良いです。

まとめ

というわけで長くなりましたが、まとめると

・Anaconda のパッケージ管理には conda と pip コマンドが付属している。
・基本は conda を利用して Anaconda のリポジトリを参照する。
・conda に無いものは pip で入れる。
・たまに重複していないかチェックして、重複しているなら conda を優先する。

これらを参考に、目的となる環境を構築すればよろしい。

こんな感じかと思います。異論は認めるので各位ご意見をいただければと。雑ですが以上です。