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 niveaux. Cependant, il arrive parfois que l’intégration avec les bibliothèques C/C existantes soit souhaitable. Cet article explore la méthode la plus efficace pour construire des liaisons Python pour ces bibliothèques.
Le module ctypes, qui fait partie de la bibliothèque standard de Python, offre 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 avec laquelle il a été compilé, garantissant ainsi la compatibilité avec diverses installations Python.
Considérez l'extrait de code suivant écrit en C :
#include <iostream> class Foo{ public: void bar(){ std::cout << "Hello" << std::endl; } };
Pour interfacer cela avec Python, il faut déclarer les fonctions comme extern "C" pour que les ctypes les reconnaissent :
extern "C" { Foo* Foo_new(){ return new Foo(); } void Foo_bar(Foo* foo){ foo->bar(); } }
Ensuite, on compile ce code dans une 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 en Python :
f = Foo() f.bar() # Prints "Hello" to standard output
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!