首頁  >  文章  >  後端開發  >  如何在 setup.py 中使用 CMake 簡化 Python 擴充構建?

如何在 setup.py 中使用 CMake 簡化 Python 擴充構建?

Susan Sarandon
Susan Sarandon原創
2024-10-26 21:56:02264瀏覽

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

使用CMake 子類化建構擴充

簡介:

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn