¿Llamar a C/C++ desde Python? [cerrado]

Resuelto shoosh asked hace 15 años • 12 respuestas

¿Cuál sería la forma más rápida de construir un enlace de Python a una biblioteca C o C++?

(Estoy usando Windows si esto es importante).

shoosh avatar Sep 28 '08 12:09 shoosh
Aceptado

El módulo ctypes es parte de la biblioteca estándar y, por lo tanto, es más estable y está ampliamente disponible que swig , que siempre tendió a darme problemas .

Con ctypes, necesita satisfacer cualquier dependencia de tiempo de compilación en Python, y su enlace funcionará en cualquier Python que tenga ctypes, no solo en aquel con el que se compiló.

Suponga que tiene una clase de ejemplo simple de C++ con la que desea hablar en un archivo llamado foo.cpp:

#include <iostream>

class Foo{
    public:
        void bar(){
            std::cout << "Hello" << std::endl;
        }
};

Dado que los ctypes solo pueden comunicarse con funciones C, debe proporcionar aquellas que las declaren como "C" externa.

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

A continuación tienes que compilar esto en una biblioteca compartida.

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

Y finalmente tienes que escribir tu contenedor de Python (por ejemplo, en fooWrapper.py)

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)

Una vez que tengas eso, puedes llamarlo así.

f = Foo()
f.bar() #and you will see "Hello" on the screen
Florian Bösch avatar Sep 28 '2008 10:09 Florian Bösch

Deberías echarle un vistazo a Boost.Python . Aquí está la breve introducción extraída de su sitio web:

La biblioteca Boost Python es un marco para interconectar Python y C++. Le permite exponer funciones y objetos de clases de C++ de forma rápida y fluida a Python, y viceversa, sin utilizar herramientas especiales, solo su compilador de C++. Está diseñado para empaquetar interfaces C++ de manera no intrusiva, de modo que no tenga que cambiar el código C++ en absoluto para empaquetarlo, lo que hace que Boost.Python sea ideal para exponer bibliotecas de terceros a Python. El uso por parte de la biblioteca de técnicas avanzadas de metaprogramación simplifica su sintaxis para los usuarios, de modo que el código empaquetado adopta el aspecto de una especie de lenguaje de definición de interfaz declarativo (IDL).

Ralph avatar Sep 28 '2008 07:09 Ralph

También existe pybind11, que es como una versión ligera de Boost.Python y compatible con todos los compiladores de C++ modernos:

https://pybind11.readthedocs.io/en/latest/

Tom Wenseleers avatar Jul 23 '2016 13:07 Tom Wenseleers