テクノロジー 開発 非公開: Python の pyproject.toml: 概要

Python の pyproject.toml: 概要

コードの共有とオープンソース ソフトウェアでのコラボレーションは、ソフトウェア開発において大きな変革をもたらしました。これにより、開発者は既存のパッケージとライブラリを使用して、より小規模なチームでより複雑なアプリケーションを構築できるようになりました。

Python エコシステムでは、ほとんどのパッケージが Python Package Index (PyPI) に登録されています。インデックスを使用すると、開発者は自分のコードを他の開発者用のパッケージとして共有できます。独自のパッケージを作成して PyPI にアップロードするには、pyproject.toml ファイルが必要です。この記事はその仕組みについてのガイドです。

Python の pyproject.toml: 概要
Python の pyproject.toml: 概要

pyproject.tomlとは何ですか?

ファイルが何であるかを理解する前に、まずファイルが埋めようとしているギャップを理解しましょう。パッケージを PyPI にアップロードすると、 pip 使用してインストール可能になります。たとえば、PyPI にアップロードした後のパッケージが example-package という名前の場合、次のコマンドを使用してインストールできます。

 pip install example-package

パッケージを Python Package Index に公開するときは、 .whl ファイルをアップロードします。しかし、コードを書くときは、主に .py ファイルを書きます。では、 .whl ファイルはどのように生成するのでしょうか? setuptools poetry などのビルド ツールを使用します。

このツールはソース コードを取得し、アップロード可能な .whl ファイルに変換します。前述したように、 whl ファイルの生成に使用できるツールは複数あります。 Python で使用するツールを指定するには、それを pyproject.toml ファイルに記述します。

したがって、pyproject.toml ファイルは、Python プロジェクトをパッケージに組み込む方法を指定するファイルです。それに加えて、PyPI 上のパッケージのリストに表示されるパッケージのメタデータなどの追加情報を提供できます。

Python の pyproject.toml: 概要
Python の pyproject.toml: 概要

Python のビルド プロセス

ビルド プロセス ツールを実行するには、次のコマンドを使用します。

 python -m build

ただし、それを行う前に、インストールする必要があります

python -m pip install build

pyproject.toml ファイルを含むプロジェクトで build コマンドを実行すると、新しいファイルとディレクトリが作成されます。これらには、 sdist と呼ばれる圧縮アーカイブ ファイルと、PyPI で配布する .whl ファイルの 2 つのファイルが含まれる dist フォルダーが含まれます。

Python パッケージを生成するにはどうすればよいですか?

これまで学んだ内容を確実に理解していただくために、ここでは Python パッケージを生成するチュートリアルの例を示します。

#1. サンプルプロジェクトを作成する

まず、次のフォルダー構造を持つ単純なパッケージを作成します。

 example_package/
├─ example_package/
│  ├─ example_module.py
│  ├─ __init__.py
├─ pyproject.toml
├─ setup.cfg
├─ README.md

プロジェクトのルート ディレクトリは example_package と呼ばれます。そこにコードベース全体が含まれています。プロジェクトのルート内には、3 つのファイルと 1 つのディレクトリがあります。それらの内容は以下で説明されます。

pyproject.toml

このファイルには、プロジェクトをビルドするときに使用するビルド ツールに関する情報が含まれています。この簡単な例の内容は次のとおりです。

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

この場合、 setuptools.build_meta ビルド バックエンドとして宣言しています。ただし setuptools.build_meta setuptools パッケージ内に含まれているため、まず、これを要件リストの要件としてリストします。この記事の後半では、指定できるその他のオプションについて説明します。

README.md

パッケージに関する情報が含まれます。これは、PyPI のパッケージのページにドキュメントとして表示されます。そのファイルには何でも書き込めます。

セットアップ.cfg

setup.cfg ファイルには、パッケージ名や現在のバージョンなどのプロジェクトのメタデータが含まれています。ここでは、次のコードを setup.cfg の内容として追加します。

 [metadata]
name = example-package
version = 1.0.0 

サンプルプロジェクト

ルート ディレクトリ内には、同じ名前の別のディレクトリが含まれています。このディレクトリにはソース コードが存在します。デモの目的で、次の 2 つのファイルを含めました。

  • example_module.py – これにはダミー関数が含まれています。あなたも同じことができます。
  • __init__.py – ディレクトリをインポートできるパッケージにします。空でもかまいません。

#2. ビルドコマンドを実行する

これで、プロジェクトのルート ディレクトリでビルド コマンドを実行できるようになりました。

 python -m build

まだインストールしていない場合は、次の手順を使用してツールをインストールしてください。

 pip install build

次のような出力が得られるはずです。

2023-06-01-01-05-54-1 のスクリーンショット
2023-06-01-01-05-54-1 のスクリーンショット

ご覧のとおり、最後の行は、 example-package-1.0.0.tar.gz example-package-1.0.0-py3-none-any-whl ビルドしたことを示しています。以下の ls コマンドを使用してディレクトリの内容を一覧表示すると、新しいファイルが表示されるはずです。

 ls

出力は次のようになります。

 dist  example_package  example_package.egg-info  pyproject.toml  README.md  setup.cfg 
2023-06-01-01-27-15 のスクリーンショット
2023-06-01-01-27-15 のスクリーンショット

dist ディレクトリの内容をリストすると、 .whl ファイルと tar.gz ファイルが見つかるはずです。

 $ ls dist
example_package-1.0.0-py3-none-any.whl
example-package-1.0.0.tar.gz 
2023-06-01-01-29-24 のスクリーンショット
2023-06-01-01-29-24 のスクリーンショット

pyproject.toml ファイルの内容

この簡単な例では、Python プロジェクトのビルド システムのみを指定しました。ただし、pyproject.toml ファイルにさらに情報を追加することもできます。これらは一般的なオプションの一部です。

メタデータ

setup.cfg でメタデータを指定する代わりに、 pyproject.toml にメタデータを記述することができます。この情報は、パッケージ インデックスにパッケージのリストを作成するときに使用されます。

さらに、パッケージの依存関係とそのバージョンを指定して、パッケージのインストール時に依存関係もインストールできるようにすることができます。

 [project]
name = "hello-world"
version = "1.0.0"
description = "My first Python package"
requires-python = ">=3.8"
keywords = ["python", "first-project"]
authors = [
    {name = "John Doe", email = "john@example.com"},
]
dependencies = [
    "requests",
    "gidgethub[httpx]>4.0.0",
] 

ツール.<ツール名>

また tool.<tool_name> を使用して、使用するツールにさまざまな構成オプションを提供することもできます。<tool_name> はツールの名前です。

これは、この方法を使用した構成をサポートするツールでのみ実行できます。たとえば、構成オプションをコード リンターである Black に渡すことができます。

 [tool.black]
line-length = 88
target-version = ["py38", "py39"]

サンプルファイル

これまでに学んだことをまとめると、pyproject.toml ファイルの例が次のようになります。

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

[metadata]
name = "my-project"
version = "1.0.0"
description = "A sample project"
author = "Your Name"
author_email = "your.email@example.com"
license = "MIT"
keywords = ["sample", "project"]

[options]
python_requires = ">=3.6"

[tool.black]
line-length = 88
include = "\\.pyi?$"
exclude = '''
/(
  \.git
  | \.hg
  | \.mypy_cache
  | \.tox
  | \.venv
  | _build
  | buck-out
  | build
  | dist
)/
'''

[tool.blackd]
port = 45484
host = "localhost"

詳細については、この ページ をお読みください。

pyproject.tomlの利点

✅ Python プロジェクトの依存関係を管理する標準的な方法を提供します。依存関係
プロジェクトのその他の関連メタデータは、宣言的な方法で指定できます。

✅ また、作成者、ライセンス、GitHub URL などの有用な属性など、プロジェクト内の他のメタデータを指定する方法も提供します。

✅ さまざまなビルドシステムに適合し、ビルドシステムの切り替えが簡単です。

最後の言葉

pyproject.toml は、setup.py を使用する際の欠点を回避するのに役立つ便利な標準です。これは、配布用のパッケージを作成する場合に最も役立ちます。ほとんどの新しいプロジェクトでは、setup.py の代わりに pyproject.toml を使用する必要があります。

次に、Windows、Linux、macOS で Python のバージョンを確認する方法を確認してください。

「 Python の pyproject.toml: 概要」についてわかりやすく解説!絶対に観るべきベスト2動画

Package Python Code With pyproject.toml & Listing Files With pathlib | Real Python Podcast #136
CH04 Pythonの実装系総ざらい (ja)

コードの共有とオープンソース ソフトウェアでのコラボレーションは、ソフトウェア開発において大きな変革をもたらしました。これにより、開発者は既存のパッケージとライブラリを使用して、より小規模なチームでより複雑なアプリケーションを構築できるようになりました。

Python エコシステムでは、ほとんどのパッケージが Python Package Index (PyPI) に登録されています。インデックスを使用すると、開発者は自分のコードを他の開発者用のパッケージとして共有できます。独自のパッケージを作成して PyPI にアップロードするには、pyproject.toml ファイルが必要です。この記事はその仕組みについてのガイドです。

Python の pyproject.toml: 概要
Python の pyproject.toml: 概要

pyproject.tomlとは何ですか?

ファイルが何であるかを理解する前に、まずファイルが埋めようとしているギャップを理解しましょう。パッケージを PyPI にアップロードすると、 pip 使用してインストール可能になります。たとえば、PyPI にアップロードした後のパッケージが example-package という名前の場合、次のコマンドを使用してインストールできます。

 pip install example-package

パッケージを Python Package Index に公開するときは、 .whl ファイルをアップロードします。しかし、コードを書くときは、主に .py ファイルを書きます。では、 .whl ファイルはどのように生成するのでしょうか? setuptools poetry などのビルド ツールを使用します。

このツールはソース コードを取得し、アップロード可能な .whl ファイルに変換します。前述したように、 whl ファイルの生成に使用できるツールは複数あります。 Python で使用するツールを指定するには、それを pyproject.toml ファイルに記述します。

したがって、pyproject.toml ファイルは、Python プロジェクトをパッケージに組み込む方法を指定するファイルです。それに加えて、PyPI 上のパッケージのリストに表示されるパッケージのメタデータなどの追加情報を提供できます。

Python の pyproject.toml: 概要
Python の pyproject.toml: 概要

Python のビルド プロセス

ビルド プロセス ツールを実行するには、次のコマンドを使用します。

 python -m build

ただし、それを行う前に、インストールする必要があります

python -m pip install build

pyproject.toml ファイルを含むプロジェクトで build コマンドを実行すると、新しいファイルとディレクトリが作成されます。これらには、 sdist と呼ばれる圧縮アーカイブ ファイルと、PyPI で配布する .whl ファイルの 2 つのファイルが含まれる dist フォルダーが含まれます。

Python パッケージを生成するにはどうすればよいですか?

これまで学んだ内容を確実に理解していただくために、ここでは Python パッケージを生成するチュートリアルの例を示します。

#1. サンプルプロジェクトを作成する

まず、次のフォルダー構造を持つ単純なパッケージを作成します。

 example_package/
├─ example_package/
│  ├─ example_module.py
│  ├─ __init__.py
├─ pyproject.toml
├─ setup.cfg
├─ README.md

プロジェクトのルート ディレクトリは example_package と呼ばれます。そこにコードベース全体が含まれています。プロジェクトのルート内には、3 つのファイルと 1 つのディレクトリがあります。それらの内容は以下で説明されます。

pyproject.toml

このファイルには、プロジェクトをビルドするときに使用するビルド ツールに関する情報が含まれています。この簡単な例の内容は次のとおりです。

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

この場合、 setuptools.build_meta ビルド バックエンドとして宣言しています。ただし setuptools.build_meta setuptools パッケージ内に含まれているため、まず、これを要件リストの要件としてリストします。この記事の後半では、指定できるその他のオプションについて説明します。

README.md

パッケージに関する情報が含まれます。これは、PyPI のパッケージのページにドキュメントとして表示されます。そのファイルには何でも書き込めます。

セットアップ.cfg

setup.cfg ファイルには、パッケージ名や現在のバージョンなどのプロジェクトのメタデータが含まれています。ここでは、次のコードを setup.cfg の内容として追加します。

 [metadata]
name = example-package
version = 1.0.0 

サンプルプロジェクト

ルート ディレクトリ内には、同じ名前の別のディレクトリが含まれています。このディレクトリにはソース コードが存在します。デモの目的で、次の 2 つのファイルを含めました。

  • example_module.py – これにはダミー関数が含まれています。あなたも同じことができます。
  • __init__.py – ディレクトリをインポートできるパッケージにします。空でもかまいません。

#2. ビルドコマンドを実行する

これで、プロジェクトのルート ディレクトリでビルド コマンドを実行できるようになりました。

 python -m build

まだインストールしていない場合は、次の手順を使用してツールをインストールしてください。

 pip install build

次のような出力が得られるはずです。

2023-06-01-01-05-54-1 のスクリーンショット
2023-06-01-01-05-54-1 のスクリーンショット

ご覧のとおり、最後の行は、 example-package-1.0.0.tar.gz example-package-1.0.0-py3-none-any-whl ビルドしたことを示しています。以下の ls コマンドを使用してディレクトリの内容を一覧表示すると、新しいファイルが表示されるはずです。

 ls

出力は次のようになります。

 dist  example_package  example_package.egg-info  pyproject.toml  README.md  setup.cfg 
2023-06-01-01-27-15 のスクリーンショット
2023-06-01-01-27-15 のスクリーンショット

dist ディレクトリの内容をリストすると、 .whl ファイルと tar.gz ファイルが見つかるはずです。

 $ ls dist
example_package-1.0.0-py3-none-any.whl
example-package-1.0.0.tar.gz 
2023-06-01-01-29-24 のスクリーンショット
2023-06-01-01-29-24 のスクリーンショット

pyproject.toml ファイルの内容

この簡単な例では、Python プロジェクトのビルド システムのみを指定しました。ただし、pyproject.toml ファイルにさらに情報を追加することもできます。これらは一般的なオプションの一部です。

メタデータ

setup.cfg でメタデータを指定する代わりに、 pyproject.toml にメタデータを記述することができます。この情報は、パッケージ インデックスにパッケージのリストを作成するときに使用されます。

さらに、パッケージの依存関係とそのバージョンを指定して、パッケージのインストール時に依存関係もインストールできるようにすることができます。

 [project]
name = "hello-world"
version = "1.0.0"
description = "My first Python package"
requires-python = ">=3.8"
keywords = ["python", "first-project"]
authors = [
    {name = "John Doe", email = "john@example.com"},
]
dependencies = [
    "requests",
    "gidgethub[httpx]>4.0.0",
] 

ツール.<ツール名>

また tool.<tool_name> を使用して、使用するツールにさまざまな構成オプションを提供することもできます。<tool_name> はツールの名前です。

これは、この方法を使用した構成をサポートするツールでのみ実行できます。たとえば、構成オプションをコード リンターである Black に渡すことができます。

 [tool.black]
line-length = 88
target-version = ["py38", "py39"]

サンプルファイル

これまでに学んだことをまとめると、pyproject.toml ファイルの例が次のようになります。

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

[metadata]
name = "my-project"
version = "1.0.0"
description = "A sample project"
author = "Your Name"
author_email = "your.email@example.com"
license = "MIT"
keywords = ["sample", "project"]

[options]
python_requires = ">=3.6"

[tool.black]
line-length = 88
include = "\\.pyi?$"
exclude = '''
/(
  \.git
  | \.hg
  | \.mypy_cache
  | \.tox
  | \.venv
  | _build
  | buck-out
  | build
  | dist
)/
'''

[tool.blackd]
port = 45484
host = "localhost"

詳細については、この ページ をお読みください。

pyproject.tomlの利点

✅ Python プロジェクトの依存関係を管理する標準的な方法を提供します。依存関係
プロジェクトのその他の関連メタデータは、宣言的な方法で指定できます。

✅ また、作成者、ライセンス、GitHub URL などの有用な属性など、プロジェクト内の他のメタデータを指定する方法も提供します。

✅ さまざまなビルドシステムに適合し、ビルドシステムの切り替えが簡単です。

最後の言葉

pyproject.toml は、setup.py を使用する際の欠点を回避するのに役立つ便利な標準です。これは、配布用のパッケージを作成する場合に最も役立ちます。ほとんどの新しいプロジェクトでは、setup.py の代わりに pyproject.toml を使用する必要があります。

次に、Windows、Linux、macOS で Python のバージョンを確認する方法を確認してください。

「 Python の pyproject.toml: 概要」についてわかりやすく解説!絶対に観るべきベスト2動画

Package Python Code With pyproject.toml & Listing Files With pathlib | Real Python Podcast #136
CH04 Pythonの実装系総ざらい (ja)