首頁 > 後端開發 > C++ > 主體

如何將 CMake 整合到 setup.py 中以建立 Python 擴充功能?

Susan Sarandon
發布: 2024-10-27 12:11:02
原創
687 人瀏覽過

How to Integrate CMake into setup.py for Building Python Extensions?

如何在setup.py 中整合CMake 以實現setuptools 擴充

建置Python 擴充功能以及對CMake 的需求

建置Python 擴充功能以及對CMake 的需求何時CMake 開發整合C 庫的Python 擴展,提供了管理建置流程的綜合工具。但是,典型的工作流程涉及在執行 setup.py bdist_wheel 之前使用 CMake 手動編譯函式庫。這可能不方便且耗時。

在 setup.py 中呼叫 CMake

為了解決這個問題,可以將 CMake 合併到 setup.py 建置過程中。關鍵是創建一個自訂的 build_ext 命令,利用 CMake 來配置和建置擴充功能。

自訂 build_ext 指令

在 setup.py 檔案中,覆寫build_ext 指令類別並註冊到指令類別中。在您的自訂實作中,配置並呼叫 CMake 來建立擴充模組。

範例專案與設定腳本

為了示範這個概念,請考慮一個有C 語言的簡單專案副檔名(foo) 和一個Python 模組(spam. eggs)。 setup.py 腳本利用 CMakeExtension 類別來封裝擴展,而不呼叫原始的 build_ext。 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 模組運行包裝函數應該會產生預期的輸出。

以上是如何將 CMake 整合到 setup.py 中以建立 Python 擴充功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!