Maison > développement back-end > C++ > le corps du texte

Comment pouvez-vous rationaliser les builds d'extensions Python à l'aide de CMake dans setup.py ?

Susan Sarandon
Libérer: 2024-10-26 21:56:02
original
263 Les gens l'ont consulté

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

Sous-classement des extensions de build avec CMake

Introduction :

L'extension de Python avec du code C nécessite une orchestration minutieuse entre les étapes de compilation et de liaison . Pour simplifier ce processus, CMake fournit un moyen pratique de configurer et de créer de telles extensions. Cependant, l'intégration de CMake avec setup.py a posé des défis aux développeurs. Cet article vise à relever ces défis en approfondissant l'extension des outils de configuration pour utiliser de manière transparente CMake dans les versions setup.py.

Le besoin d'intégration :

Traditionnellement, les extensions Python sont compilé et lié avant d'exécuter setup.py, créant un processus fastidieux en deux étapes. En tirant parti de CMake, les développeurs bénéficient d'un contrôle précis sur les séquences de construction complexes. De plus, la prise en charge des extensions Python de CMake permet une compilation sans effort directement à partir de setup.py, éliminant ainsi le besoin d'étapes intermédiaires.

Personnalisation des extensions de build :

Pour intégrer CMake dans la configuration .py, une classe d'extension personnalisée est nécessaire. Cette sous-classe, CMakeExtension, remplace le comportement de construction par défaut pour appeler des commandes CMake à la place.

Exemple d'intégration :

Considérons une structure de projet simple qui inclut une extension C (foo) et un module Python (spam.eggs). Les fichiers CMakeLists.txt et setup.py jouent un rôle crucial dans le processus de construction :

# 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()
Copier après la connexion

La classe CMakeExtension s'enregistre comme une extension spéciale qui appelle CMake uniquement pendant le processus de construction, tandis que le build_ext personnalisé remplace le comportement par défaut pour appeler CMake.

Test de la construction :

La construction du projet implique d'exécuter setup.py sdist bdist_wheel. La distribution de roues résultante peut être installée et testée à l'aide de pip show pour vérifier que la bibliothèque d'extension Python (libfoo.dylib) est présente. L'appel de la fonction wrapper dans spam.eggs confirme que l'extension fonctionne comme prévu.

Conclusion :

L'extension de setuptools avec CMake dans setup.py offre une approche simplifiée de la création Extensions Python qui s'appuient sur CMake pour les séquences de construction complexes. Il permet aux développeurs d'intégrer ces deux outils de manière transparente, réduisant ainsi les étapes manuelles et améliorant le flux de travail de développement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!