Python講座 / Pythonパッケージをビルドしてインストールを検証する

Pythonのプロジェクトはpyproject.tomlでビルド情報を宣言し、wheelなどの配布物を作れます。完成したwheelを新しい環境へ入れ、ソースの外から確認すると、手元のソースにだけ依存したimportを見つけられます。

配布名とimport名を区別する

このローカル実習の配布名はexpensekit-demo、importするパッケージ名はexpensekitです。ハイフンのある配布名とモジュール名は同じでなくても構いません。src構成は、不完全な導入でもプロジェクト直下から偶然importできてしまう問題を見つけやすくします。

ファイルを作っても公開リポジトリーの同名パッケージの権利や利用可能性を確保したことにはなりません。この実習はローカルのビルドと導入までで、公開アップロードは行いません。

パッケージ実行とインストール環境の検証は、仮想環境とpipでパッケージを管理するで扱う規則とつながります。

必要な全ファイルを作る

プロジェクトのsrc/expensekit/__init__.pyを作成します。

def total(amounts):
    if any(type(x) is not int or x < 0 for x in amounts):
        raise ValueError("invalid amount")
    return sum(amounts)

src/expensekit/cli.pyを作成します。

import argparse
from . import total

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("amounts", type=int, nargs="+")
    args = parser.parse_args()
    print(total(args.amounts))

if __name__ == "__main__":
    main()

プロジェクト直下にpyproject.tomlを作成します。

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

[project]
name = "expensekit-demo"
version = "0.1.0"
description = "Local expense sum example"
requires-python = ">=3.12"

[project.scripts]
expense-total = "expensekit.cli:main"

[tool.setuptools.packages.find]
where = ["src"]

ビルドして新しい環境へ導入する

pyproject.tomlのある場所でビルドツールを導入し、実行します。

python -m pip install build
python -m build

distへwheelとソース配布物ができることを確認します。検証専用の仮想環境を作ります。

python -m venv .venv-check

Windows PowerShellでは新しいインタープリターで導入します。

.\.venv-check\Scripts\python.exe -m pip install dist/expensekit_demo-0.1.0-py3-none-any.whl

macOSやUbuntuでは次を使います。

.venv-check/bin/python -m pip install dist/expensekit_demo-0.1.0-py3-none-any.whl

.venv-checkを有効化するか、以下のpythonをそのインタープリターの完全なパスへ置き換えます。ソースプロジェクト外の新しいフォルダーへ移動して実行します。

python -c "from expensekit import total; print(total([3500,8000,2500]))"
python -m expensekit.cli 3500 8000 2500

両方14000が予想結果です。project.scriptsのexpense-totalも、有効化した環境から同じmainを呼べます。ランチャーやPATHに問題がある場合は、モジュール実行でも入口を明確に確認できます。

不足ファイルと公開前の準備を確認する

ソースの中だけでimportが成功するなら、選んだPython、導入済み配布物、パッケージ探索とwheelの中身を確認します。実行に必要な依存はproject.dependenciesへ宣言し、対象Pythonの範囲との互換性を調べます。開発用ツールをすべて実行時依存へ入れる必要はありません。

実際の公開には名前の確認、ライセンスと著者情報、README、含めるファイルと秘密情報の点検、リポジトリー認証、リリース方針が別に必要です。ローカル導入の成功だけで公開の準備が整うわけではありません。パッケージと実行の入口と同様、CLIモジュールのimportだけで引数解析を始めない形を保ちます。

関連する公式リファレンス

この実習の完了範囲はローカル配布物をビルドし、新しい仮想環境へインストールしてimportとコマンドを確認するところまでです。PyPIへの公開は別作業です。distには expensekit_demo-0.1.0-py3-none-any.whl と expensekit_demo-0.1.0.tar.gz ができます。検証にも.venv-checkのPythonを明示するか、その環境を有効にして、開発環境の既存インストールで偶然成功することを防ぎます。

project/
  pyproject.toml
  src/
    expensekit/
      __init__.py
      cli.py
  dist/
    expensekit_demo-0.1.0-py3-none-any.whl
    expensekit_demo-0.1.0.tar.gz