2008-11-10 10 views
37

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

Las alternativas que probamos eran:

  • Boost.Python

    Me gustó la API limpia producida por Boost.Python, pero el hecho de que se hubiera requerido que los usuarios instalen una dependencia adicional hecha nosotros cambiamos a SWIG.

  • TRAGO

    La principal ventaja de TRAGO para nosotros fue que no requiere que los usuarios finales instalarlo para utilizar el programa final.

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

Respuesta

22

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 mucho 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 otra vez, para proyectos más grandes de larga duración, la inversión adicional en SWIG lo vale.

5

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

Envoltura C++ utilizando estas herramientas es un poco más complicado que el C, pero se puede hacer. Here es la página wiki al respecto.

6

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

  1. Para un conjunto dado de archivos, trago genera más duplicar el código (overhead) de 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 Python Wrapper Tools: A Performance Study. Lamentablemente, el enlace aparece roto. Tengo una copia personal que se puede compartir a pedido.

+0

Me interesa verlo. ¿Puede publicarlo en algún lado y vincularlo? De lo contrario, podemos hacer arreglos para que se lo envíe directamente. –

+4

La máquina de retorno tiene una copia: http: //web.archive.org/web/20070703071726/http://people.web.psi.ch/geus/talks/europython2004_geus.pdf –

+0

FYI SIP es utilizado por PyQt, lo que significa que al menos no es inútil. –

18

EDITAR - Robin el proyecto es abandonado por desgracia, y no será de mucha utilidad hoy

He usado Robin con gran éxito.

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

+1

+1 nunca escuché esto antes de una De hecho, se ve bastante bien. – ConcernedOfTunbridgeWells

+0

El enlace parece estar roto. Aquí hay uno que funciona: http://pypi.python.org/pypi/Robin/1.0.1 –

+0

Gracias Jason, el enlace del proyecto actualizado es http://code.google.com/p/robin/ (versión 1.0.4 está fuera), editó la respuesta. – orip

2

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 pura de Python.

La desventaja: Se necesita tanto tiempo para instalar y usar Boost que todo el Tab-finalización ahorro de tiempo no siempre va a amortizar ;-(

así que prefiero trago: No hay campanas y silbatos, pero funciona de forma fiable después de un breve ejemplo introductorio.

Cuestiones relacionadas