c++ python boost swig

Exponer una API de C++ a Python



cython (5)

EDITAR: el proyecto Robin está lamentablemente abandonado, y no será de mucha utilidad hoy

Utilicé a Robin con gran éxito.

Gran integración con tipos de C ++, y crea un único archivo .cpp para compilar e incluir en su objeto compartido.

Actualmente estoy trabajando en un proyecto en el que tuve que ajustar las clases de C ++ con Python para poder guiar el programa. Así que mi experiencia específica también implicó incrustar el intérprete de Python en nuestro programa.

Las alternativas que probé fueron:

  • Boost.Python

    Me gustó la API más limpia producida por Boost.Python, pero el hecho de que hubiera requerido que los usuarios instalaran una dependencia adicional nos hizo cambiar a SWIG.

  • TRAGO

    La principal ventaja de SWIG para nosotros es que no requiere que los usuarios finales lo instalen para usar el programa final.

¿Qué has usado para hacer esto y cuál ha sido tu experiencia con eso?


He usado ambos (para el mismo proyecto): Boost está mejor integrado con el STL, y especialmente con las excepciones de C ++. Además, su mecanismo de administración de memoria (que intenta unir la gestión de memoria C ++ y Python GC) es mucho más flexible que SWIG. Sin embargo, SWIG tiene mucha mejor documentación, no hay dependencias externas, y si obtiene la biblioteca envuelta en SWIG para Python, está a más de la mitad de conseguir un envoltorio Java / Perl / Ruby.

No creo que haya una opción clara: para proyectos más pequeños, me gustaría ir con Boost.Python de nuevo, para proyectos de larga duración más grandes, la inversión adicional en SWIG lo vale.


Sugiero SIP . SIP es mejor que SWIG debido a las siguientes razones:

  1. Para un conjunto determinado de archivos, swig genera más código duplicado (sobrecarga) que SIP. SIP logra generar menos código duplicado (sobrecarga) mediante el uso de un archivo de biblioteca que puede vincularse estática o dinámicamente. En otras palabras, SIP tiene una mejor escalabilidad.

  2. El tiempo de ejecución de SIP es mucho menor que el de SWIG. Consulte las herramientas de contenedor de Python: un estudio de rendimiento . Lamentablemente, el enlace aparece roto. Tengo una copia personal que se puede compartir a pedido.


Una gran ventaja para Boost :: Python es que permite completar pestañas en el shell de ipython: importas una clase de C ++, expuesta directamente por Boost, o la subescribes, y desde ese momento, realmente se comporta como una clase de Python pura.

La desventaja: lleva tanto tiempo instalar y usar Boost que todo el ahorro de tiempo de finalización de tabulación nunca se amortizará ;-(

Así que prefiero Swig: sin campanas y silbatos, pero funciona de manera confiable después de un breve ejemplo introductorio.


pyrex o cython también son formas buenas y fáciles de mezclar los dos mundos.

Envolviendo C ++ usando estas herramientas es un poco más complicado luego de envolver C pero se puede hacer. Here está la página wiki al respecto.