setup.py 内で CMake を使用して Python 拡張機能のビルドを効率化するにはどうすればよいでしょうか?

Susan Sarandon
リリース: 2024-10-26 21:56:02
オリジナル
263 人が閲覧しました

 How can you streamline Python extension builds using CMake within setup.py?

CMake によるビルド拡張機能のサブクラス化

はじめに:

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!