🚀

pyproject.tomlでPoetryを使わず自作パッケージを作成する

2024/10/09に公開

前提

  • setup.pyではなくpyproject.tomlを使用する
  • poetryは使わない

パッケージの元となるフォルダを準備

以下のようにパッケージの元となるフォルダを準備する。

project_root_directory
└── src
    └── mypkg
        ├── __init__.py
        ├── main.py
        ├── mod.py
        └── subdir
            └── submod.py
main.py
from mypkg.mod import modfunc
from mypkg.subdir.submod import submodfunc

def main():
    modfunc()
    submodfunc()

if __name__ == "__main__":
    main()

__init__.pyはなくてもよいが、あるとパッケージであることが明示的にわかりやすくなる。

pyproject.tomlを作成

pyproject.tomlにビルドに必要な情報やパッケージの基本情報を記載する。
build-backendには様々なツールが利用できるが、今回はsetuptoolsを使用。

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

[project]
name = "mypkg"
version = "1.0.0"
description = "A package for test"

nameで指定した名前は、installの時やpip showで一覧を表示した際に使用される。

作成したpyproject.tomlはプロジェクトルートフォルダに配置する。

project_root_directory
├── pyproject.toml
└── src
    └── mypkg
        ├── __init__.py
        ├── main.py
        ├── mod.py
        └── subdir
            └── submod.py

MANIFEST.inを作成

スクリプト以外に追加しておきたいデータがある場合は、MANIFEST.inに記載する。

include data/some_data.txt

参考: Controlling files in the distribution (setuptools 公式ドキュメント)

buildパッケージをインストール

PyPAが作成したbuildパッケージをインストールする。

pip install build
conda install build

コマンド実行

python -m build           # ソースディストリビューションとバイナリディトリビューション両方を作成
python -m build --sdist   # ソースディストリビューションのみ作成

install

以下のコマンドでインストールが可能。condaはおそらく未対応。

pip install ~~~.tar.gz
pip install ~~~.whl

installが完了するとlib/site-packagesの中にメターデータを管理するフォルダや、mypkgというソースコードが入ったフォルダ(ソースディストリビューションからのインストール時のみ?)が作成される。MANIFEST.inでその他のデータを含めた場合には、そのデータもmypkgの中に格納される。

import

コード内で以下のようにインポートが可能となる。

import mypkg

zipで作成したい場合

pyproject.tomlをパッケージ内の同じ階層に入れておき、zip化するとzipのパッケージが完成

参考文献

https://packaging.python.org/ja/latest/
https://zenn.dev/sankantsu/articles/1cddd3c08582a1
https://packaging.python.org/ja/latest/discussions/setup-py-deprecated/

Discussion