複雑なPythonパッケージのビルド#
このガイドでは、純粋なPythonか、CやC++のような他の言語でいくつかの簡単な拡張を持つパッケージのどちらかに焦点を当てています。
C/C++/Fortran/Rust 拡張機能を使用してコンパイルされたプロジェクトをパッケージ化するための包括的なガイダンスについては、コンパイルされたパッケージ化に関する科学的 Python 開発ガイド を参照してください。これは、複雑なビルドに最適なリファレンスであり、scikit-build-core、meson-python、maturin、その他の最新のビルド バックエンドをカバーしています。
これらのタイプのパッケージについて質問がある場合は、このガイドの GitHub リポジトリで issue を開いてください。ビルド時に Python 以外の依存関係を必要とするコンパイル済み拡張機能を持つ Python パッケージのビルドと配布には、多くの細かい注意点があります。これらの注意点の概要と詳細な議論については、このサイトを参照してください。
純粋な Python パッケージと他言語の拡張機能を持つパッケージ#
Pythonパッケージの複雑さを3つの一般的なカテゴリに分類することができます。 これらの分類は、正しいパッケージフロントエンドとバックエンドツールを選択するのに役立ちます。
純粋なPythonパッケージ: Pythonだけに依存して機能するパッケージです。 純粋なPythonパッケージの構築はよりシンプルです。 そのため、以下のツールの中から自分の欲しい機能を持つものを選び、決定しましょう!
Python以外の拡張を持つPythonパッケージ: これらのパッケージには、他の言語(CやC++など)で書かれた拡張と呼ばれる 追加コンポーネントがあります。 Python 以外の拡張を持つパッケージがある場合、拡張コードをコンパイルするために必要な、追加のビルドステップを可能にするビルドバックエンドツールを選択する必要があります。 さらに、ワークフローをサポートするフロントエンドツールを使いたい場合は、追加のビルド設定をサポートするツールを選択する必要があります。 Hatchのようなカスタムビルドステップをサポートするビルドツールを選択することをお勧めします。
**異なる言語で書かれた拡張(例えばFortranやC++)を持つPythonパッケージや、 インストールが困難なPython以外の依存関係(例えばGDAL)を持つPythonパッケージ: ** これらのパッケージは、しばしば複雑なビルド手順を持ちます(例えば、いくつかのC拡張を持つ パッケージよりも複雑です)。 そのため、これらのパッケージのビルドには scikit-build や meson-python といったツールが必要になります。 注:meson-pythonはPDMと一緒に使うことができます。
フロントエンドとバックエンドの混合プロジェクト#
ビルドフロントエンドと別のビルドバックエンドを併用することが必要な場合や望ましい場合があります。これは、フロントエンドの中にはデフォルトのバックエンド(build)を持たないものがあり、この選択はメンテナに委ねられているからです。他のバックエンド (hatch) には推奨されるバックエンド (hatchling) がありますが、メンテナは別のものに移行することができます。一方、一部のバックエンド (poetry) は単一のバックエンド (poetry-core) でのみ動作します。フロントエンドとバックエンドの互換性に関する詳細は、 (#python-package-build-tools) を参照してください。
このパッケージングガイドでは、 hatch とそのバックエンドである hatchling の使用を推奨します。これはほとんどのパッケージに適していますが、拡張モジュールを作成する際に必要であれば、Hatchで別のバックエンドを使用することもできます。Pythonの拡張モジュールは、一部または全部がコンパイルされたコードで構成されています。この場合、( meson-python のような)バックエンドは、拡張言語をコンパイルしてPythonにバインドする方法を知っていなければなりません。 プラグイン を利用するか、すでに拡張モジュールを構築できるバックエンドに置き換えなければなりません。
別のバックエンドを使用するには、プロジェクトの pyproject.toml を編集する必要があります。 hatch コマンドで生成された pyproject.toml や、パッケージングチュートリアルに従った pyproject.toml がある場合は、次のように変更する必要があるかもしれません。
[build-system]
-requires = ["hatchling"]
+requires = ["meson-python"]
-build-backend = "hatchling.build"
+build-backend = "mesonpy"