簡介:
使用C 程式碼擴充Python 需要在編譯和連結步驟之間進行仔細編排。為了簡化此過程,CMake 提供了一種便捷的方法來配置和建構此類擴充。然而,將 CMake 與 setup.py 整合給開發人員帶來了挑戰。本文旨在透過深入研究擴展 setuptools 以在 setup.py 建置中無縫使用 CMake 來解決這些挑戰。
整合的需求:
傳統上,Python 擴充功能是在運行 setup.py 之前編譯和鏈接,創建一個繁瑣的兩步過程。透過利用 CMake,開發人員可以獲得對複雜構建序列的細粒度控制。此外,CMake 的 Python 擴充功能支援允許直接從 setup.py 輕鬆編譯,無需中間步驟。
自訂建置擴充功能:
將 CMake 整合到 setup 中.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 安裝和測試產生的 Wheel 發行版,以驗證 Python 擴充程式庫 (libfoo.dylib) 是否存在。呼叫 spam.eggs 中的包裝函數可確認擴充功能如預期運作。
結論:
在 setup.py 中使用 CMake 擴充 setuptools 提供了一種簡化的建置方法依賴 CMake 進行複雜建置序列的 Python 擴充。它使開發人員能夠無縫整合這兩個工具,減少手動步驟並增強開發工作流程。
以上是如何在 setup.py 中使用 CMake 簡化 Python 擴充構建?的詳細內容。更多資訊請關注PHP中文網其他相關文章!