Maison >développement back-end >Tutoriel Python >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 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-15 21:52:11260parcourir

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 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!

Déclaration:
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
Article précédent:Caltech dans PyTorchArticle suivant:Caltech dans PyTorch