建置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中文網其他相關文章!