複雑なPythonパッケージのビルド#

このガイドでは、純粋なPythonか、CやC++のような他の言語でいくつかの簡単な拡張を持つパッケージのどちらかに焦点を当てています。

For comprehensive guidance on packaging compiled projects with C/C++/Fortran/Rust extensions, see the Scientific Python Development Guide on compiled packaging. This is the best reference for complex builds and covers scikit-build-core, meson-python, maturin, and other modern build backends.

If you have questions about these types of package, please open an issue about this guide specifically in the GitHub repo for this guide. There are many nuances to building and distributing Python packages that have compiled extensions requiring non-Python dependencies at build time. For an overview and thorough discussion of these nuances, please see this site.

Pure Python packages vs. packages with extensions in other languages#

Pythonパッケージの複雑さを3つの一般的なカテゴリに分類することができます。 これらの分類は、正しいパッケージフロントエンドとバックエンドツールを選択するのに役立ちます。

  1. 純粋なPythonパッケージ: Pythonだけに依存して機能するパッケージです。 純粋なPythonパッケージの構築はよりシンプルです。 そのため、以下のツールの中から自分の欲しい機能を持つものを選び、決定しましょう!

  2. Python以外の拡張を持つPythonパッケージ: これらのパッケージには、他の言語(CやC++など)で書かれた拡張と呼ばれる 追加コンポーネントがあります。 Python 以外の拡張を持つパッケージがある場合、拡張コードをコンパイルするために必要な、追加のビルドステップを可能にするビルドバックエンドツールを選択する必要があります。 さらに、ワークフローをサポートするフロントエンドツールを使いたい場合は、追加のビルド設定をサポートするツールを選択する必要があります。 Hatchのようなカスタムビルドステップをサポートするビルドツールを選択することをお勧めします。

  3. **異なる言語で書かれた拡張(例えばFortranやC++)を持つPythonパッケージや、 インストールが困難なPython以外の依存関係(例えばGDAL)を持つPythonパッケージ: ** これらのパッケージは、しばしば複雑なビルド手順を持ちます(例えば、いくつかのC拡張を持つ パッケージよりも複雑です)。 そのため、これらのパッケージのビルドには scikit-buildmeson-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"