Python パッケージング

「物議を醸す」意見

Python パッケージをパッケージ化および配布するためにsetup.pyを使用することは、時々非常に困難になることがあります。 PoetryUVのような最新のツールは、パッケージングをずっと簡単にするだけでなく、依存関係を非常に便利に管理するのにも役立ちます。特に UV は、従来のツールよりも 10〜100 倍高速である点で注目に値します。

Poetry に関する詳細情報が必要な場合は、次の記事を読むことができます。

超高速 Python パッケージマネージャーである UV の包括的なガイドについては、UV: 超高速 Python パッケージマネージャーをお読みください。

はじめに

Python パッケージングとは、Python プロジェクトを配布およびインストールできるように準備するプロセスです。主なアプローチは 2 つあります。従来のsetup.pyメソッドと、PEP-517、PEP-518、および PEP-660 で定義されている最新のpyproject.tomlアプローチです。

プロジェクト構造を管理するために不可欠なファイルおよびディレクトリパスの処理に関する包括的なガイドについては、ファイルとディレクトリのパスページを参照してください。

従来の アプローチ:setup.py

setup.pyファイルは、従来の Python プロジェクトの中心です。プロジェクトに関するすべてのメタデータを記述します。プロジェクトにリッチなメタデータセットを与えるために追加できるフィールドはかなりありますが、必須フィールドは名前、バージョン、パッケージの 3 つだけです。名前フィールドは、パッケージを Python Package Index (PyPI) で公開したい場合、一意である必要があります。バージョンフィールドは、プロジェクトの異なるリリースを追跡します。パッケージのフィールドは、プロジェクト内のどこに Python ソースコードを配置したかを記述します。

これにより、Python パッケージを簡単にインストールできます。多くの場合、次のように記述するだけで十分です。

python setup.py install

そしてモジュールが自己インストールされます。

例:setup.py

最初の setup.py にはライセンスに関する情報も含まれ、long_descriptionフィールドに README.txt ファイルを再利用します。これは次のように表示されます。

# setup.py: define package metadata for distribution
from distutils.core import setup
setup(
   name='pythonCheatsheet',  # Package name (must be unique on PyPI)
   version='0.1',  # Version number
   packages=['pipenv',],  # List of packages to include
   license='MIT',  # License type
   long_description=open('README.txt').read(),  # Read description from file
)
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

setup.pyファイルにおける 3 つの必須フィールドは何ですか?
A. name, author, license
B. name, description, packages
C. name, version, packages
D. name, version, license

最新の アプローチ:pyproject.toml

pyproject.tomlファイルは、Python プロジェクト構成の最新の標準です(PEP-517、PEP-518、PEP-660)。ビルドシステムの要件とプロジェクトのメタデータを単一の宣言的なファイル形式で指定するための統一された方法を提供します。

pyproject.toml の利点

  • 宣言的: すべてのプロジェクトメタデータが一箇所に
  • ビルドシステムに依存しない: setuptools、poetry、flit、その他のビルドバックエンドと連携
  • コード実行なし: setup.py よりも安全で予測可能
  • 標準化: より良いツールサポートのために PEP 標準に従う

例:pyproject.toml

setuptools を使用した基本的なpyproject.tomlの例を次に示します。

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

[project]
name = "pythonCheatsheet"
version = "0.1"
description = "A Python cheatsheet package"
readme = "README.txt"
requires-python = ">=3.8"
license = {text = "MIT"}
authors = [
    {name = "Your Name", email = "your.email@example.com"}
]
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
]

[project.optional-dependencies]
dev = [
    "pytest>=7.0",
    "black>=22.0",
]

pyproject.toml からのインストール

pyproject.tomlを使用すると、pip を使用してパッケージをインストールできます。

pip install .

または編集可能モードで:

pip install -e .
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

pyproject.tomlsetup.pyよりも優れている主な利点は何ですか?
A. 実行が速いこと
B. 宣言的であり、安全(コード実行なし)、PEP 標準に従っていること
C. 設定が少なくて済むこと
D. Python 3.10+ でのみ動作すること

適切なアプローチの選択

  • setup.pyを使用する: レガシープロジェクトを扱っている場合、または細かい制御が必要な場合
  • pyproject.tomlを使用する: 新しいプロジェクトの場合(推奨)、最新の標準であり、より良いツールサポートを提供するため

詳細については、公式ドキュメントをご覧ください。

関連リンク