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
Libérer: 2024-12-15 21:52:11
original
143 Les gens l'ont consulté

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;
        }
};
Copier après la connexion

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

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

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

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

f = Foo()
f.bar() # Prints "Hello" to standard output
Copier après la connexion

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