Articles of Swig

¿Cuál es la forma más limpia de llamar a una función de Python desde C ++ con un objeto envuelto SWIG?

Tengo el siguiente código, que implementa una clase simple de C ++ (ObjWithPyCallback) con una función de callback de Python. La idea es llamar a la función Python con “esto” como único argumento. El problema es que, dado que ObjWithPyCallback es un objeto envuelto SWIG, necesito el tipo de información SWIG para crear un objeto […]

% typemapping de una biblioteca de C ++ para la interfaz de Python

Quiero crear un contenedor python para mi biblioteca C ++. Sería genial si hubiera una conversión automática de std :: vector a las listas de python y al revés. Desafortunadamente, si agrego este código a mi archivo de interfaz, todavía recibo errores en tiempo de ejecución. %typemap(in) std::vector value (std::vector vIn) { int iLen = […]

auto_ptr con swig

Estoy tratando de envolver una biblioteca de C ++ que usa auto_ptr. Estoy usando swig y quiero generar enlaces de python. He visto la sección del documento de swig sobre cómo usar swig con punteros inteligentes aquí . Pero no puedo hacerlo funcionar. Swig genera código que quiere inicializar auto_ptr usando una referencia constante, pero […]

Usando SWIG con puntero para funcionar en C struct

Estoy tratando de escribir un contenedor SWIG para una biblioteca de C que utiliza punteros a funciones en sus estructuras. No puedo averiguar cómo manejar estructuras que contienen punteros de función. Un ejemplo simplificado sigue. prueba.i: /* test.i */ %module test %{ typedef struct { int (*my_func)(int); } test_struct; int add1(int n) { return n+1; […]

Cómo exponer una clase de C ++ a Python sin construir un módulo

Quiero saber si hay alguna forma de exponer una clase de C ++ a Python pero sin construir una biblioteca compartida intermedia. Aquí está mi escenario deseable. Por ejemplo tengo la siguiente clase de C ++: class toto { public: toto(int iValue1_, int iValue2_): iValue1(iValue1_), iValue2(iValue2_) {} int Addition(void) const {if (!this) return 0; return […]

SWIG: Cómo pasar la lista de complejos de c ++ a python

Tengo una función en c ++ que devuelve una lista de complejos: #include std::list< std::complex > func(…); ¿Qué debo hacer en el archivo ‘* .i’? Gracias a todos. ================= Los siguientes son detalles: la función que me gustaría usar en python en xh: std::list<std::complex > roots1(const double& d, const double& e); He intentado algunas maneras: […]

¿Cómo SWIG ajusta un mapa en Python?

Estoy usando SWIG 2.0 para crear un contenedor de Python para una biblioteca de C ++. Un método tiene un argumento de tipo “const std :: map &”. SWIG felizmente genera una envoltura para él, pero no puedo descubrir cómo invocar el método. Si paso, por ejemplo, {“a”: “b”} para ese argumento, obtengo un error […]

setup.py: ejecuta build_ext antes que nada

Estoy trabajando con un setup.py que crea un montón de archivos de interfaz SWIG durante el paso build_ext. Esto debe ejecutarse primero, porque los pasos de comstackción posteriores necesitan una lista completa de los archivos de Python para funcionar correctamente (como copiar los archivos de Python al directorio del paquete, crear el huevo, crear la […]

Cómo manejar unique_ptr’s con SWIG

Tengo una clase EventDispatcher que implementa el patrón de publicación-suscripción. Su interfaz se ve algo como esto (simplificado): class EventDispatcher { public: void publish(const std::string& event_name, std::unique_ptr event); std::unique_ptr subscribe(const std::string& event_name, std::unique_ptr callback); private: std::unordered_map<std::string, std::vector<std::unique_ptr>> m_subscriptions; } Quiero exponer esta clase a Python. La última documentación de SWIG establece que: No hay un […]

SWIG envolviendo C ++ para Python: traduciendo una lista de cadenas a un vector STL de cadenas STL

Me gustaría envolver una función C ++ con SWIG que acepte un vector de cadenas STL como un argumento de entrada: #include #include #include using namespace std; void print_function(vector strs) { for (unsigned int i=0; i < strs.size(); i++) cout << strs[i] << endl; } Quiero envolver esto en una función de Python disponible en […]