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 におけるパッケージ管理に関係のあるキーワードをアルファベット順に。

  • easy_install

    • setuptools に付属しているコマンドラインツール。easy_install を使うと簡単なコマンドで web 上 (e.g. PyPI) から パッケージをダウンロードしてインストールすることができる。
  • ez_setup.py

    • setuptools をインストールする際に利用されるスクリプトの名前。
  • distribute

    • setuptools の更新が停滞していた時に発生した setuptools のクローン。 2013年に setuptools とマージされたので、distribute のことは気にする必要はないはず。
  • distutils

    • Python 標準のパッケージ管理の基本的な機能を提供するモジュール (import distutils)。 setuptools が distutils の高機能版で広く使われているので setuptools を使うのが一般的。
  • setuptools

    • distutils を強化したパッケージ管理用の setuptools というモジュールと、 easy_install というコマンドラインツールのセット。
  • setup.py

    • setuptools, distutils でパッケージの定義を記述するスクリプトに使われるファイル名。 作成されたパッケージをインストールする際にも利用される。
  • pip

    • easy_install の強化版ツール
  • PyPI

    • the Python Package Index。だれでも Python のパッケージが登録できる python.org のサイト。 easy_install とか pip は基本的にここからパッケージを探してきてインストールしてくれる。
  • Python Eggs

    • setuptools で定義された Python の配布形式。 Python のコードやメタ情報その他を所定のフォーマットに従って zip で固めたもの (distutils の生成するzip/tar の拡張版)。 setuptools を使って (つまり setuptools を使って setup.py を定義していれば) 作成することができる。
  • Python Wheels

    • 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はPython 3.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.core import setup

setup(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.py
python 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
  • アーカイブをダウンロードしてインストール

  • User site directory へインストール

    • 前述の ez_setup.py に --user を付けて setuptools とそれに付随する easy_install を User site directory にインストールした場合は、 easy_install によってインストールされるパッケージもデフォルトで User site directory にインストールされる。
    • /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 が使えるようになります。

その他

  • virtualenv

    • Python の isolated な仮想環境を virtualenv ENV コマンド一発で作り出す超便利ツール。
    • 仮想環境毎に別々のパッケージがインストールできるので、クリーンな環境を作ったり、 アプリケーションによって異なるバージョンのパッケージを使ったりするのに便利。
    • root 権限がないユーザがパッケージを入れるのにも便利ではあるが、2.6以降は User site directory があるので virtualenv を使わなくても非rootユーザ毎にパッケージを入れるのは簡単。

参考文献

最終更新: 2016/6/29