メモの日々


2024年09月26日(木) [長年日記]

[python] Pythonにおけるパッケージング(2)

7年前にPython 2でパッケージ化する方法をメモしていた。少し前にPython 3でパッケージを作る方法を調べたので、忘れないようにメモしておく。

情報源が https://packaging.python.org/ であることは変わっていない。日本語版もある。

pyproject.tomlを用意

現代ではsetup.pyの代わりにpyproject.tomlを使う。ここに次のような内容を設定する。

[project]
name = "oreore"
version = "0.1.0"

[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

[build-system] に指定可能なツールが色々あって悩みどころだが、本記事ではSetuptoolsを使う。

Pythonのコードを用意

以前と同じ構成のコードを用意する。ただし、コードは「src/パッケージ名」というディレクトリの下に置くのが標準的なようなのでそのようにする(参考:src レイアウト対フラットレイアウト)。

$ tree . --noreport
.
├── pyproject.toml
└── src
    └── oreore
        ├── hello
        │   ├── __init__.py
        │   └── hello.py
        └── world
            ├── __init__.py
            └── world.py

前回同様hello.pyを実行可能スクリプトと認識させたかったが、pyproject.tomlでそのような指定をする方法は無さそうだった。代わりに、hello.pyの関数を呼び出す実行可能スクリプトを自動生成させることはできて、そのためにはpyproject.tomlに次のような設定を追加すればよい(参考:Entry Points)。

[project.scripts]
hellohello = "oreore.hello.hello:hello"

これにより、oreore/hello/hello.py の関数hello()を呼び出すスクリプト hellohello が、oreoreパッケージのインストール時に作られるようになる。

Wheelファイルを作る

以上の準備により、Wheelファイルを作成できるようになる。

Wheelファイルを作成するにはbuildを使うことが標準的なようだ。ただし、別途インストールが必要。pipにもWheelの作成機能があるので、ここではbuildではなくpipを使う。

$ python -m pip wheel --no-deps .

これにより、カレントディレクトリに oreore-0.1.0-py3-none-any.whl が作られる。

pip wheelの注意点として、buildというディレクトリが作られその中にビルド時のソースコードが残るという点がある。これが次のpip wheel実行時にも参照されるので、例えばhello.pyをhello2.pyに改名してpip wheelを実行し直すとWheelファイル内に(本来は含まれるべきでない)hello.pyが含まれてしまう(pipのバージョン24.2で確認)。

なので、pip wheelの実行前にはbuildディレクトリは削除した方がよさそう。buildにはこの問題はなさそうだったので、pip wheelではなく素直にbuildを使う方がいいのかもしれない(この段落はディレクトリ名のbuildとツール名のbuildが混在していて分かりにくい…)。