¿Cómo puedo integrar c ++ y Python con SWIG

Posible duplicado:
Integrar Python y C ++

Soy el GUY de python y hago cosas web en django. Quiero saber que tan fácil o difícil es integrar Python y C ++ utilizando SWIG.

¿Es eficiente / fácil de hacer o debería dejar C ++ y codificar las cosas en python?

Hay algunas cosas que los archivos C ++ ya han sido codificados por los progtwigdores anteriores. Sé que SWIG se utiliza para integrar idiomas, pero no sé qué implicaciones prácticas o problemas existen para usarlo.

o No hay uso de él y volver a escribir código en Python es la mejor opción.

A menudo utilizo swig for work para traducir código a múltiples idiomas y es una herramienta muy útil.

Para comprender cuál es la mejor manera para usted, debe observar las interfaces de su software. Si las clases de c ++ tienen métodos que solo reciben y devuelven tipos simples como cadenas o estructuras stl, puede estar seguro de que su código no tiene problemas para ser “robado”. Los problemas te llegan cuando tienes interfaces complejas.

Otro problema con python es la presencia de GIL que en entornos de múltiples subprocesos (con llamadas de locking en el lado de c ++) puede causar muchos problemas e involucra una administración compleja (usar la biblioteca python-dev en su código de c ++).

Una sugerencia si su código de destino está escrito solo en python es echar un vistazo a las bibliotecas boost-python que, al ser más especializadas, suelen ser más sencillas de usar con python. Los problemas con los entornos multiproceso, sin embargo, siguen siendo.

Usar un gulp es fácil . Por lo general, más fácil de lo que la gente piensa. Ver http://www.swig.org/tutorial.html .

Básicamente, solo tiene que escribir un archivo de interfaz * .i que solo incluya los encabezados que necesita.
example.i:

%module example %{ /* Includes the header in the wrapper code */ #include "header.h" %} /* Parse the header file to generate wrappers */ %include "header.h" 

Luego usa SWIG para generar una envoltura. Compílalo con tu código c ++ y listo:

 $ swig -python example.i $ g++ -c example.cc example_wrap.cc \ -I/usr/local/include/python2.1 $ ld -shared example.o example_wrap.o -o _example.so 

Tienes tu módulo de python.

 >>> import example >>> example.foo() 

Cómo usar SWIG para interactuar con python y C ++. (Lengua en la mejilla)

  • Genere un archivo .i que represente algún encabezado de C ++. A pesar de que SWIG analiza (intenta analizar) su archivo de encabezado, todavía necesita un archivo de interfaz de swig para decirle a swig lo que se va a importar.
  • Solución: ¡Simple! Dígale a uno de los miembros de su proyecto que escriba un analizador de archivos de cabecera de C ++ que genere un archivo .i.
  • Luego ejecuta un gulp contra ese archivo .i.
  • Entonces mira como falla.
  • Edite el archivo de encabezado e inserte #ifndef SWIG … #endif alrededor del código que SWIG no entiende.
  • Enjuague y repita.
  • Una vez que funcione, vea el globo del archivo de cabecera c ++ de 50 líneas en un archivo .cpp de swig de más de 5000 líneas y en un archivo .py algo más pequeño.
  • Haga lo mismo con todos los archivos de encabezado que desea envolver.
  • Compile su nueva y mejorada aplicación de C ++ con ganchos que se pueden cerrar con python.
  • Ir a almorzar. La comstackción y el enlace no se harán en el corto plazo.