Python 拡張機能の構築と CMake の必要性
の場合C ライブラリを統合する Python 拡張機能を開発する場合、CMake はビルド プロセスを管理するための包括的なツールを提供します。ただし、一般的なワークフローでは、setup.py bdist_wheel を実行する前に、CMake を使用してライブラリを手動でコンパイルする必要があります。これは不便で時間がかかる可能性があります。
setup.py での CMake の呼び出し
これに対処するには、CMake を setup.py ビルド プロセスに組み込むことができます。 。重要なのは、CMake を利用して拡張機能を構成およびビルドするカスタム build_ext コマンドを作成することです。
build_ext コマンドのカスタマイズ
setup.py ファイルで、 build_extコマンドクラスを作成し、コマンドクラスに登録します。カスタム実装内で、CMake を構成して呼び出し、拡張モジュールをビルドします。
サンプル プロジェクトとセットアップ スクリプト
概念を実証するために、C を使用した単純なプロジェクトを考えてみましょう。拡張子 (foo) と Python モジュール (spam.eggs)。 setup.py スクリプトは、元の build_ext を呼び出すことなく拡張機能をカプセル化する CMakeExtension クラスを利用します。 build_cmake メソッドは、CMake の構成とビルド ステップを処理します。
<code class="python">import os import pathlib from setuptools import setup, Extension from setuptools.command.build_ext import build_ext_orig class CMakeExtension(Extension): def __init__(self, name): # don't invoke the original build_ext for this special extension super().__init__(name, sources=[]) class build_ext(build_ext_orig): def run(self): for ext in self.extensions: self.build_cmake(ext) super().run() def build_cmake(self, ext): cwd = pathlib.Path().absolute() # these dirs will be created in build_py, so if you don't have # any python sources to bundle, the dirs will be missing build_temp = pathlib.Path(self.build_temp) build_temp.mkdir(parents=True, exist_ok=True) extdir = pathlib.Path(self.get_ext_fullpath(ext.name)) extdir.mkdir(parents=True, exist_ok=True) # example of cmake args config = 'Debug' if self.debug else 'Release' cmake_args = [ '-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + str(extdir.parent.absolute()), '-DCMAKE_BUILD_TYPE=' + config ] # example of build args build_args = [ '--config', config, '--', '-j4' ] os.chdir(str(build_temp)) self.spawn(['cmake', str(cwd)] + cmake_args) if not self.dry_run: self.spawn(['cmake', '--build', '.'] + build_args) setup( name='spam', version='0.1', packages=['spam'], ext_modules=[CMakeExtension('spam/foo')], cmdclass={ 'build_ext': build_ext, } )</code>
テストと検証
プロジェクトのホイールをビルドしてインストールすることで、ライブラリが適切であるかどうかを確認できます。正常にインストールされ、機能しています。 spam.eggs モジュールからラッパー関数を実行すると、期待どおりの出力が生成されるはずです。
以上がPython 拡張機能を構築するために CMake を setup.py に統合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。