Exponer una API de C++ a Python


Actualmente estoy trabajando en un proyecto donde tuve que envolver las clases de C++ con Python para poder escribir 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:

  • Aumentar.Python

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

  • SWIG

    La principal ventaja de SWIG para nosotros fue 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 ello?

Author: Marcos Lara, 2008-11-10

5 answers

He usado ambos (para el mismo proyecto): Boost está mejor integrado con el STL, y especialmente con las excepciones de C++. Sin embargo, SWIG tiene mucha mejor documentación, sin dependencias externas, y si obtiene la biblioteca envuelta en SWIG para Python, está a más de la mitad del camino para obtener un contenedor Java/Perl/Ruby también.

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

 22
Author: Max Maximus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-10 07:41:53

EDITAR-el proyecto Robin está tristemente abandonado, y no será de mucha utilidad hoy

He usado Robin con gran éxito.

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

 18
Author: orip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-03 06:28:05

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 (overhead) que SIP. SIP se las arregla para generar menos código duplicado (sobrecarga) mediante el uso de un archivo de biblioteca que se puede vincular 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. Desafortunadamente el enlace aparece roto. Tengo una copia personal que se puede compartir bajo petición.

 6
Author: bhadra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-13 14:45:33

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

Envolver C++ usando estas herramientas es un poco más complicado que envolver C, pero se puede hacer. Aquí está la página wiki sobre esto.

 5
Author: Toni Ruža,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-20 05:20:28

Una gran ventaja de Boost::Python es que permite completar tabulaciones en el shell de ipython: Importas una clase C++, expuesta directamente por Boost, o la subclases, y a partir de entonces, realmente se comporta como una clase Python pura.

El inconveniente: Lleva tanto tiempo instalar y usar Boost que toda la pestaña-ahorro de tiempo de finalización nunca se amortizará ; - (

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

 2
Author: wr.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-11 11:27:15