Pythonパッケージの配布方法いろいろ
Pythonソースコードでないプログラムを配布しようとするとき、主に次の二つの方法があります。
- sdist
- bdist
sdist
はソースディストリビューションの略でソースコード状態での配布を、bdist
はバイナリディストリビューションの略でバイナリの配布を意味します。bdistの中にも種類があり、wheel形式の配布物を作るときbdist_wheel
にします。
これらの形式を指定して配布物を作成するとき、setup.py
を用いて次のようにします。
1 | python3 setup.py sdist |
また、バイナリ配布は動的ライブラリやライブラリローダの場所が環境依存なのでできるだけ避けたほうがいいと思います。
パッケージに含めるファイルの指定
setup.py
でも指定できますが、ややこしいのと、方法が一貫的じゃないのでMANIFEST.in
を使います。C++関係のファイルを追加するには./MANIFEST.in
に次の内容を書きます。
1 | include *.cpp *.hpp Makefile |
詳細はこちら https://docs.python.org/ja/3/distutils/sourcedist.html#specifying-the-files-to-distribute
pip install
時コンパイル
pip install
時には任意の処理を行うことができます。
関連する処理を抜き出しました。ポイントはsetuptools.setup
でcmdclass -> build_ext
を指定しているとこです。pip install
時にはpython3 setup.py build
みたいな処理が走るのですが、ここでその処理を上書きしています。ただ、このコードを走らせるためにはcmdclass -> ext_modules
に少なくとも一つExtension
がないといけないので適当に入れています。
(hoge
のように意味のない文字を入れていますが、my_ext
でbuild_extension
をオーバーライドしていない場合にはsetuptools
によってビルドが行われ、hoge.cpython-38-x86_64-linux-gnu.so
みたいな成果物ができます。しかしこのsetuptools
のビルドはコンパイラの動作をラッピングしているだけではっきり言っておせっかいなので、自分でMakefileなりスクリプトなりを書くのがおすすめです。)
また、self.build_lib
にはビルド時の一時的な生成物置き場が指定されており、ここに置いたファイルがインストールされ、アンインストール時には削除されます。
1 | import subprocess |
私のリポジトリにこのやり方で配布しているプロジェクトがあるので全体を見たい方はどうぞ。 https://github.com/shosatojp/ffcache/blob/master/setup.py
setup.py
のデバッグ
pip
はsdist
で生成されたtar.xz
からもインストールできるのでpypiに上げる前に試しておくといいです。
1 | rm -rf dist/ build/ *.egg-info/ |
参考
- [ソースコード配布物を作成する] https://docs.python.org/ja/3/distutils/sourcedist.html
- [ビルド済み配布物を作成する] https://docs.python.org/ja/3/distutils/builtdist.html
- [Pythonモジュールの配布] https://docs.python.org/ja/3/distributing/index.html
- [APIリファレンス] https://docs.python.org/ja/3/distutils/apiref.html