"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je créer efficacement des liaisons Python pour les bibliothèques C / C ++ à l'aide de CTYPES?

Comment puis-je créer efficacement des liaisons Python pour les bibliothèques C / C ++ à l'aide de CTYPES?

Publié le 2025-02-06
Parcourir:505

How Can I Efficiently Create Python Bindings for C/C   Libraries Using ctypes?

Interfaçage c / c avec python

La facilité d'utilisation et l'extensibilité de Python en font un langage attrayant pour les programmeurs de tous les niveaux. Cependant, il y a des moments où l'intégration aux bibliothèques C / C existantes est souhaitable. Cet article explore la méthode la plus efficace pour construire des liaisons Python pour ces bibliothèques.

Le module CTYPES, une partie de la bibliothèque standard de Python, propose une solution stable et largement disponible pour cette tâche. Contrairement à d'autres méthodes de liaison, CTYPES ne s'appuie pas sur la version Python par rapport à laquelle il a été compilé, assurant la compatibilité avec diverses installations Python.

Considérez l'extrait de code suivant écrit en C:

#include 

class Foo{
    public:
        void bar(){
            std::cout  

Pour l'interfacer avec Python, nous devons déclarer les fonctions comme extern "C" pour Ctypes pour les reconnaître:

extern "C" {
    Foo* Foo_new(){ return new Foo(); }
    void Foo_bar(Foo* foo){ foo->bar(); }
}

Suivant, nous compilons ce code en bibliothèque partagée en utilisant:

g   -c -fPIC foo.cpp -o foo.o
g   -shared -Wl,-soname,libfoo.so -o libfoo.so  foo.o

Enfin, nous créons un wrapper python:

from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')

class Foo(object):
    def __init__(self):
        self.obj = lib.Foo_new()

    def bar(self):
        lib.Foo_bar(self.obj)

avec ce wrapper, nous pouvons interagir avec notre bibliothèque C dans Python:

f = Foo()
f.bar() # Prints "Hello" to standard output
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3