Exponiendo una API de C ++ a Python

Actualmente estoy trabajando en un proyecto donde tuve que envolver las clases de C ++ con Python para poder ejecutar el progtwig. Así que mi experiencia específica también involucró la incorporación del intérprete de Python en nuestro progtwig.

Las alternativas que probé fueron:

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

He usado ambos (para el mismo proyecto): Boost está mejor integrado con la STL, y especialmente con las excepciones de C ++. Además, su mecanismo de administración de memoria (que trata de unir la administración de memoria C ++ y Python GC) es mucho más flexible que el de SWIG. Sin embargo, SWIG tiene una documentación mucho mejor, sin dependencias externas, y si obtiene la biblioteca envuelta en SWIG para Python, estará más que a medio camino de conseguir una envoltura Java / Perl / Ruby también.

No creo que haya una opción clara: para proyectos más pequeños, optaría por Boost.Python nuevamente, para proyectos más grandes y de larga duración, la inversión adicional en SWIG vale la pena.

EDITAR: el proyecto Robin está tristemente abandonado y no será de mucha utilidad hoy.

He usado a Robin con gran éxito.

Excelente integración con los tipos de C ++, y crea un solo archivo .cpp para comstackr e incluir en su objeto compartido.

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

  1. Para un conjunto dado 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 se puede vincular de forma estática o dinámica. En otras palabras, SIP tiene mejor escalabilidad.

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

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

Ajustar C ++ utilizando estas herramientas es un poco más complicado que envolver C, pero se puede hacer. Aquí está la página wiki al respecto.

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

El inconveniente: la instalación y el uso de Boost demoran tanto tiempo que todo el ahorro de tiempo en la finalización de la pestaña nunca se amortizará ;-(

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