Heim > Backend-Entwicklung > C++ > Wie können Sie Python-Erweiterungs-Builds mithilfe von CMake in setup.py optimieren?

Wie können Sie Python-Erweiterungs-Builds mithilfe von CMake in setup.py optimieren?

Susan Sarandon
Freigeben: 2024-10-26 21:56:02
Original
381 Leute haben es durchsucht

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

Subclassing Build Extensions mit CMake

Einführung:

Das Erweitern von Python mit C-Code erfordert eine sorgfältige Orchestrierung zwischen Kompilierungs- und Verknüpfungsschritten . Um diesen Prozess zu vereinfachen, bietet CMake eine bequeme Möglichkeit, solche Erweiterungen zu konfigurieren und zu erstellen. Allerdings hat die Integration von CMake mit setup.py die Entwickler vor Herausforderungen gestellt. Dieser Artikel zielt darauf ab, diese Herausforderungen anzugehen, indem er sich mit der Erweiterung von Setuptools befasst, um CMake nahtlos in setup.py-Builds zu verwenden.

Die Notwendigkeit der Integration:

Traditionell sind Python-Erweiterungen dies kompiliert und verknüpft, bevor setup.py ausgeführt wird, wodurch ein langwieriger zweistufiger Prozess entsteht. Durch die Nutzung von CMake erhalten Entwickler eine detaillierte Kontrolle über komplexe Build-Sequenzen. Darüber hinaus ermöglicht die Python-Erweiterungsunterstützung von CMake eine mühelose Kompilierung direkt aus setup.py, sodass keine Zwischenschritte erforderlich sind.

Anpassen von Build-Erweiterungen:

Um CMake in Setup zu integrieren .py, eine benutzerdefinierte Erweiterungsklasse ist erforderlich. Diese Unterklasse, CMakeExtension, überschreibt das Standard-Build-Verhalten, um stattdessen CMake-Befehle aufzurufen.

Beispielintegration:

Betrachten Sie eine einfache Projektstruktur, die eine C-Erweiterung (foo) enthält. und ein Python-Modul (spam.eggs). Die Dateien CMakeLists.txt und setup.py spielen eine entscheidende Rolle im Build-Prozess:

# 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()
Nach dem Login kopieren

Die CMakeExtension-Klasse registriert sich selbst als spezielle Erweiterung, die CMake nur während des Build-Prozesses aufruft, während die angepasste build_ext diese überschreibt Standardverhalten zum Aufrufen von CMake.

Testen des Builds:

Das Erstellen des Projekts erfordert das Ausführen von setup.py sdist bdist_wheel. Die resultierende Wheel-Distribution kann mit pip show installiert und getestet werden, um zu überprüfen, ob die Python-Erweiterungsbibliothek (libfoo.dylib) vorhanden ist. Der Aufruf der Wrapper-Funktion in spam.eggs bestätigt, dass die Erweiterung wie erwartet funktioniert.

Fazit:

Die Erweiterung von setuptools mit CMake in setup.py bietet einen optimierten Ansatz zum Erstellen Python-Erweiterungen, die für komplexe Build-Sequenzen auf CMake basieren. Es ermöglicht Entwicklern, diese beiden Tools nahtlos zu integrieren, manuelle Schritte zu reduzieren und den Entwicklungsworkflow zu verbessern.

Das obige ist der detaillierte Inhalt vonWie können Sie Python-Erweiterungs-Builds mithilfe von CMake in setup.py optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage