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

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

将来的には、より複雑なビルドを必要とするパッケージングワークフローのためのリソースを提供したいと考えています。 このようなタイプのパッケージについて質問がある場合は、 私たちのdiscourseに質問を追加する か、 このガイドの GitHub リポジトリでこのガイドに関する issue を発行する してください。 ビルド時に Python 以外の依存関係を必要とするコンパイルされた拡張機能を持つ Python パッケージをビルドして配布するには、多くの微妙な違いがあります。 これらの微妙な違いの概要と徹底的な議論については、 このサイト を参照してください。

純粋なPythonパッケージと他言語の拡張機能付きパッケージの比較#

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

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

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

  3. Python packages that have extensions written in different languages (e.g. Fortran and C++) or that have non Python dependencies that are difficult to install (e.g. GDAL): These packages often have complex build steps (more complex than a package with just a few C extensions for instance). As such, these packages require tools such as scikit-build or meson-python to build. NOTE: you can use meson-python with 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"