はじめに:
C コードで Python を拡張するには、コンパイル手順とリンク手順の間で慎重なオーケストレーションが必要です。このプロセスを簡素化するために、CMake はそのような拡張機能を構成および構築するための便利な方法を提供します。ただし、CMake を setup.py と統合することは、開発者にとって課題となっています。この記事は、setup.py ビルドで CMake をシームレスに使用するための setuptools の拡張を詳しく掘り下げて、これらの課題に対処することを目的としています。
統合の必要性:
従来、Python 拡張機能はsetup.py を実行する前にコンパイルとリンクが行われるため、面倒な 2 段階のプロセスが作成されます。 CMake を活用することで、開発者は複雑なビルド シーケンスをきめ細かく制御できるようになります。さらに、CMake の Python 拡張機能サポートにより、setup.py から直接簡単にコンパイルできるため、中間手順が不要になります。
ビルド拡張機能のカスタマイズ:
CMake をセットアップに統合するには.py、カスタム拡張クラスが必要です。このサブクラス CMakeExtension は、デフォルトのビルド動作をオーバーライドして、代わりに CMake コマンドを呼び出します。
統合の例:
C 拡張機能 (foo) を含む単純なプロジェクト構造を考えてみましょう。および Python モジュール (spam.eggs)。 CMakeLists.txt ファイルと setup.py ファイルは、ビルド プロセスで重要な役割を果たします。
# CMakeLists.txt project(spam) set(src "spam") set(foo_src "spam/foo.c") add_library(foo SHARED ${foo_src}) # setup.py from setuptools import setup, Extension from setuptools.command.build_ext import build_ext_orig class CMakeExtension(Extension): def __init__(self, name): super().__init__(name, sources=[]) class build_ext(build_ext_orig): def run(self): for ext in self.extensions: self.build_cmake(ext) super().run()
CMakeExtension クラスは、ビルド プロセス中にのみ CMake を呼び出す特別な拡張機能として自身を登録しますが、カスタマイズされた build_ext は、 CMake を呼び出すデフォルトの動作。
ビルドのテスト:
プロジェクトのビルドには、setup.py sdist bdist_wheel の実行が含まれます。結果として得られるホイールディストリビューションは、pip show を使用してインストールおよびテストし、Python 拡張ライブラリ (libfoo.dylib) が存在することを確認できます。 spam.eggs のラッパー関数を呼び出すと、拡張機能が期待どおりに動作することが確認されます。
結論:
setup.py で CMake を使用して setuptools を拡張すると、効率的なビルド アプローチが提供されます。複雑なビルド シーケンスを CMake に依存する Python 拡張機能。これにより、開発者はこれら 2 つのツールをシームレスに統合できるため、手動の手順が減り、開発ワークフローが強化されます。
以上がsetup.py 内で CMake を使用して Python 拡張機能のビルドを効率化するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。