Pythonのパッケージの作成と登録


setup.pyとpyproject.tomlの関係

setup.pyとpyproject.tomlの役割

setup.pyは長い間、Pythonパッケージのビルドと配布のための標準的な設定ファイルとして使用されてきました。しかし、近年ではpyproject.tomlが推奨されています。pyproject.tomlは、パッケージングツールやその他のツールの設定を一元管理するためのファイルです。

pyproject.tomlの利点

  1. ツールの統一:
    pyproject.tomlは、ビルドシステムの依存関係やプロジェクトのメタデータを一つのファイルにまとめることができます。これにより、プロジェクトの設定が一元化され、管理が容易になります。

  2. ビルドシステムの宣言:
    [build-system]テーブルを使用して、プロジェクトのビルドに必要なツールや依存関係を明示的に宣言できます。これにより、ビルド環境の再現性が向上します。

  3. ツール間の互換性:
    pyproject.tomlは、setuptoolspoetryflitなどの異なるビルドツールと互換性があります。これにより、特定のツールに依存せずにプロジェクトを管理できます。

setup.pyは不要か?

新しいプロジェクトでは、pyproject.tomlを使用することが強く推奨されています。特に、ビルド中にカスタムスクリプトを実行する必要がない場合、setup.pyは最小限のスタブとしてのみ使用されるべきです。具体的には、以下のように最小限のsetup.pyを使用できます:

# setup.py
import setuptools
setuptools.setup()

具体的な設定例

以下に、pyproject.tomlの具体的な設定例を示します:

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

[project]
name = "your-package-name"
version = "0.1.0"
description = "A short description of your package"
authors = [
    { name = "Your Name", email = "your.email@example.com" }
]
dependencies = [
    "requests >= 2.0.0",
    "numpy >= 1.18.0"
]

[tool.black]
line-length = 88

PyPIへのパッケージ登録手順

  1. TestPyPIでのテスト:

    • TestPyPIにアカウントを作成し、APIトークンを取得します。
    • パッケージをビルドし、TestPyPIにアップロードしてテストします。
  2. APIトークンの取得:

    • PyPI(またはTestPyPI)のアカウント設定からAPIトークンを生成します。
  3. .pypircファイルの設定:

    • ホームディレクトリに.pypircファイルを作成し、以下のように設定します:
[distutils]
index-servers =
    pypi
    testpypi

[pypi]
username = __token__
password = <Your-PyPI-API-token>

[testpypi]
username = __token__
password = <Your-TestPyPI-API-token>
  1. パッケージのビルドとアップロード:
    • python -m buildコマンドでパッケージをビルドします。
    • python -m twine upload --repository testpypi dist/*でTestPyPIにアップロードします。
    • テストが成功したら、python -m twine upload dist/*で本番のPyPIにアップロードします。

まとめ

最新の情報では、pyproject.tomlが推奨されています。特に新しいプロジェクトでは、pyproject.tomlを使用することで、設定の一元管理やビルド環境の再現性が向上します。setup.pyは最小限のスタブとして使用し、主要な設定はpyproject.tomlに記述することが推奨されます。

Citations:
[1] Pythonで自作ライブラリを作るとき、setup.pyに代えてpyproject.tomlを使ってみませんか?
[2] pyproject.toml を書く
[3] Should pyproject.toml configs always be required to use poetry? #3443
[4] Should I be using only pyproject.toml? [closed]
[5] pyproject.toml specification