Python パッケージ管理技術まとめ (pip, setuptools, easy_install, etc)
Python のパッケージ管理関係の情報がオフィシャルには整理されてなく、またパッケージ管理まわりででてくるキーワードもいくつもあって分かり難いので完結にまとめてみました。このドキュメント自体は少し長いですが、結論としては2015年1月時点では
- 原則 pip を使ってパッケージの管理を行う
- setuptools も広く使われているので入れておくとよい。そもそも pipのインストール時に自動的ににインストールされる
- distribute は 2013年に setuptools にマージされたので不要
という方針でよいと思います。
ただ少し古い情報ソースやパッケージのドキュメントを読んでいるとdistribute の利用が勧められていたり、 site-packages, easy_install,ez_setup.py, distutils, PyPI, Eggs, etc...と色々なキーワードが出て来て、それぞれが何なのかを理解していないと混乱してしまいます。そのため、それぞれの技術と技術同士の関係を理解しておくのは Pythonで正しくパッケージ管理を行う上で大切かと思います。
目次
キーワード
Pythonにおけるパッケージ管理に関係のあるキーワードをアルファベット順に。
- setuptools に付属しているコマンドラインツール。easy_installを使うと簡単なコマンドで web 上 (e.g. PyPI) からパッケージをダウンロードしてインストールすることができる。
- setuptools をインストールする際に利用されるスクリプトの名前。
- setuptools の更新が停滞していた時に発生した setuptoolsのクローン。 2013年に setuptools とマージされたので、distributeのことは気にする必要はないはず。
- Python 標準のパッケージ管理の基本的な機能を提供するモジュール(import distutils)。 setuptools が distutilsの高機能版で広く使われているので setuptools を使うのが一般的。
- distutils を強化したパッケージ管理用の setuptoolsというモジュールと、 easy_installというコマンドラインツールのセット。
- setuptools, distutilsでパッケージの定義を記述するスクリプトに使われるファイル名。作成されたパッケージをインストールする際にも利用される。
- easy_install の強化版ツール
- the Python Package Index。だれでも Pythonのパッケージが登録できる python.org のサイト。 easy_installとか pipは基本的にここからパッケージを探してきてインストールしてくれる。
- setuptools で定義された Python の配布形式。 Pythonのコードやメタ情報その他を所定のフォーマットに従って zipで固めたもの (distutils の生成するzip/tar の拡張版)。 setuptoolsを使って (つまり setuptools を使って setup.py を定義していれば)作成することができる。
- Python Eggs の後継のフォーマット。
その他
- buildout, virtualenv
事前知識
site-packages
- Python には
site-packagesというディレクトリが存在し、そのサイト(マシン環境) 固有のモジュールは site-packagesに保存されるようになっている。 - site-packages が モジュールの探索パス (sys.path)に足された後、sitecustomize というモジュールが暗黙的に Python にimport される。 sitecustomizeにサイト固有の設定を書いておくことができる。
sys.setdefaultencoding('utf-8')でエンコーディングを設定するのによく使われる。 - sitecustomize.py は sys.pathが通っているディレクトリならどこにおいてもよいけど、site-packagesに置くのが自然である。
- ちなみに site-packages と似た、site-pythonというのも存在するらしいが、あまり使われていないし、site-pythonはPython3.5で廃止されるようなので気にしなくてよい。
参考文献
User site directory
- Python 2.6 から
per user site-packagesというものが存在していて、ユーザ毎のモジュールを保存することができる。 per user site-packagesを使えば site-packagesにアクセス権がないユーザ (環境標準の Pythonを使っているならすべての非rootユーザ) も site-packagesにモジュールが簡単にインストールできる。- per user site-packages のパスは、
site.UER_SITEで参照できる。Linux だと$HOME/.local/lib/pythonX.Y/site-packages。 Macだと$HOME/Library/Python/X.Y/lib/python/site-packages - Python 2.6 以降は Virtual Pythonとかをユーザ毎の環境を作るためだけに使う必要はない。もちろんisolated な環境を作るのには依然として有益である。
参考文献
PyPI
PyPI: the Python Package Index。だれでも Python のパッケージが登録できる python.org のサイト。 後述のeasy_install とか pipはここからパッケージを探してきてインストールしてくれる。
distutils
- Python標準のパッケージ管理用のモジュール。パッケージ管理の基本的な機能を提供する。
- setuptools や pip などのその他のパッケージ管理システムは distutilsに機能を拡張するものである。
- パッケージ管理について理解するにはまず distutilsの基本は理解しておいたほうがよいかもしれない。
- しかしパッケージ作成に実際に使うのは distutils の拡張であるsetuptools だろうから、distutilsの仕様をそこまで細かく理解しておく必要はあまりないかも。
基本
Python のソースコードの入ったディレクトリに:
from distutils.coreimport setupsetup(name='foo', version='1.0', py_modules=['foo'],)のような setup.py というファイルを用意する。 この例では fooというモジュールがあるモジュール配布物 (module distribution)を定義している。 setup.py ができたら、:
python setup.py sdistを実行する。そうすると、dist というディレクトリに module distribution の.zip や .tar.gz ファイルが作成される。これを配布すれば良い。配布されたパッケージをインストールするには、sdistで作成されたファイルをダウンロード・解凍して、展開先のディレクトリで:
python setup.py installを実行すればよい。site-packages にインストールが行われる。User site directory にインストールしたい場合には、install コマンドに--userオプションを付ける。--userオプションを付ければ、非rootユーザも自分のホームディレクトリにモジュール配布物をインストールすることができる。その他のコマンドの一覧は:
python setup.py --help-commandsで表示できる。
distutils における依存関係の扱い
distutils ドキュメントには、setup に渡す requiresパラメータで依存関係が定義できるという下りがあるが、setupのパラメータ一覧には requires はないようにみえる。整合性が取れていなくてよく分からない。PEP314 にはrequiresに関する言及がある。 おそらく現行(2.7)の distutilsでは依存関係の宣言とそれによるインストールはサポートされていない。
distribute
setuptoolsのクローン。setuptools の開発が進まないので、 distributeという setuptools のブランチが作成されていた。 少し古いページではdistribute のインストールが勧められていることも多い。 しかし、2013年にdistribute は setuptoolsにマージされたので今後は distribute を使う必要はないと思われる。
setuptools
distutils を拡張するライブラリと easy_installというモジュールのインストールを行う補助コマンドのセット。更新が停止していたので、代替として distribute が開発されていたがdistribute は2013年にマージされたので、今後はsetuptools を使えば良い。
インストール
ez_setup.pyというブートストラップ用のスクリプトをダウンロードし実行する。:
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.pypython ez_setup.py前述の User site directory にインストールする場合には、:
python ez_setup.py --userを実行する。 Mac の Python には始めから入っているような気がする。:
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/setuptools参考文献
https://pypi.python.org/pypi/setuptools
easy_install
簡単に PyPIや指定されたURLにあるアーカイブからモジュールのインストールが行えるコマンド。setuptools に付随している。パッケージを自作しないユーザが setuptolsを入れる直接的な理由のほとんどはこれをインストールするためであろう。
easy_install の使い方
PyPI から最新版をダウンロードしてインストール
- easy_install SQLObject
アーカイブをダウンロードしてインストール
- easy_installhttp://example.com/path/to/MyPackage-1.2.3.tgz
User site directoryへインストール- 前述の ez_setup.py に --user を付けて setuptoolsとそれに付随する easy_install を User site directoryにインストールした場合は、 easy_installによってインストールされるパッケージもデフォルトで User sitedirectory にインストールされる。
- /usr/bin/easy_install のような環境にインストールされているeasy_install を利用してUser site directoryにパッケージをインストールしたい場合には、 --userオプションをつければよい。 ただ、Mac OS に付随しているsetuptools は古いのか --user が何故か使えない...ので、easy_install 自体を User site directoryに自分でインストールしてそちらを使うほうが良い模様。
- その他の使い方
文献
Python Eggs
setuptools で定義された Pythonの配布形式。 Pythonのコードやメタ情報その他を所定のフォーマットに従って zip で固めたもの(distutils の生成するzip/tar の拡張版)。 setuptools を使って (つまりsetuptools を使って setup.py を定義していれば) 作成することができる。
ez_setup.py
上述したように、setuptoolsのインストールに利用されるブートストラップ用のスクリプト。
pip
pip はeasy_install の強化版です。パッケージのアンインストールなど、easy_installにはない機能が提供されています。 2014年12月現在、pip を使うのが Pythonにおける最もモダンなパッケージ管理方法だと思います。
インストール & アップグレード
- wget "https://bootstrap.pypa.io/get-pip.py"
rootにインストールする場合
- sudo python get-pip.py
非rootで User site directory にインストール場合
- python get-pip.py --user
pip 自体をアップデートする
- pip install -U pip
使い方
PyPI から最新版をダウンロードしてインストール
pip install SQLObject
User site directory へインストール
pip install --user SQLObject- easy_install と違って --user 付きでインストールした pipもデフォルトでは root にパッケージをインストールしようとするので、 User site directoryにインストールしたい場合は
--userは省略できない。
パッケージを更新
pip install <packagename> --update
更新があるパッケージを表示
pip list --outdated
Wheels
インストール
pip install wheel(必要ならば --user をつける)Wheelの作成
- setup.py が setuptools を使って書かれていれば、 wheelをインストールすることで bdist_wheel が使えるようになります。
その他
- Python の isolated な仮想環境を
virtualenv ENVコマンド一発で作り出す超便利ツール。 - 仮想環境毎に別々のパッケージがインストールできるので、クリーンな環境を作ったり、アプリケーションによって異なるバージョンのパッケージを使ったりするのに便利。
- root権限がないユーザがパッケージを入れるのにも便利ではあるが、2.6以降は
User site directoryがあるので virtualenvを使わなくても非rootユーザ毎にパッケージを入れるのは簡単。
- Python の isolated な仮想環境を
参考文献
- Python Hack-a-thon 4 ハンズオン中級コース日本語でよくまとまっていてわかりやすい。
- ついに Python のパッケージ管理の情報が公式に整理され始めた?
- Packaging Historyとか2014になってからまとめ始めている。2015年以降の情報は今のところないけれど。