Este documento discute las opciones para integrar código C++ con Python. Explica que Python es útil para productividad mientras que C++ es mejor para desempeño. Presenta opciones como Python/C API, Cython, SWIG y Boost para crear interfaces entre los lenguajes. Recomienda que SWIG es popular pero que Boost es mejor para ambientes C++, aunque requiere más conocimiento de C++. Finalmente, enfatiza que Python y C++ pueden trabajar juntos de forma efectiva.
GeoEtiquetas (2das Jornadas Latinoamérica y Caribe gvSIG)
Integrando mis librerías C++ con Python
1. Integrando mis
Librerías C++ con Python
Ing. Carlos Gustavo Ruiz
http://atmantree.com
Noviembre, 2012
CC BY-NC-SA 3.0
2. Temas
● El problema del PVP ● Swig
● Por qué C++ con
● Boost
Python ● Otros
● Opciones de ● A modo de
integración conclusión
● Python/C API
● Cython
16. Por qué C++ con Python
● ¿Por qué Python?
● Versatilidad
● Multiplataforma
● Respuestas para
todo
● Rapidez de
desarrollo
● Difusión
● Ahora con PyConVE
17. Por qué C++ con Python
● ¿Por que C++?
● Amplia cantidad de
librerías
● Flexibilidad
● Poder y Control
● Performance
● Es de “alto” nivel
● C++ 11 (¿C++ pyhonizado?)
18. Por qué C++ con Python
● ¿Por qué Python? ● ¿Por que C++?
● Versatilidad ● Amplia cantidad de
● Multiplataforma librerías
● Respuestas para
● Flexibilidad
todo ● Poder y Control
● Rapidez de ● Performance
desarrollo ● Es de “alto” nivel
● Difusión ● C++ 11 (¿C++ pyhonizado?)
● Ahora con PyConVE
19. Por qué C++ con Python
Finalmente es un hecho irrefutable que el
mundo está escrito sobre C y C++.
20. Por qué C++ con Python
Finalmente es un hecho irrefutable que el
mundo está escrito sobre C y C++.
Interoperar y generar interfaces con estos
lenguajes no solo es conveniente sino
deseable.
23. #include “Python.h”
● Usos ● Para tomar en
● Implementar cuenta
módulos de Python ● Pasarás mucho rato
● Agregar el intérprete escribiendo Py.. y
de Python a su _Py.. dentro de C y
aplicación C++ C++
● Bueno para ● Se debe tomar en
cuenta restrcciones
● Optimizar módulos en cuanto a el
● Agregar Scripting acceso a objetos
Python a tu App static o global.
24. #include “Python.h”
● Más información en
● http://docs.python.org/2/c-api/
● http://docs.python.org/2/extending/
25. Cython
● Cython != Python ● No es necesario
● Basado en PyRex escribir un wrappers
● Cython permite
● Pero..
agregar “sabor a C”
a Python
● Luego de la versión
0.13 Cython da
soporte nativo a C++
..es otro lenguaje.
26. Swig
● Es tal vez la forma ● En la mayoría de los
más estándar de casos no requiere
compartir librerías modificar el código
con otros lenguajes. original.
● Crea interfaces para
para acceder a las
librerías.
● Ideal para compartir
librerías
preexistentes
27. Swig
● Bueno para:
● Facilitar tareas (UI, testing, customize &
reconfigure)
● Incorporando C/C++ a un lenguaje de mas alto
nivel resulta en mayor productividad, flexibilidad,
menos código, etc.
● La programación C++ se hace más deseable (o
soportable)
28. Swig
● Usos para:
● Más Flexibilidad
– Reemplaza main() por una versión pythonica en
esteroides.
● Acelerar las Pruebas
– Probando tu librería C++ con una serie de scripts
– Usando el intérprete como debugger
● Integrar sistemas
● Crear módulos de alto “performance”
30. Boost
● Boost trae C++ 11 al ● Puede ser utilizado
presente. tanto para Extender
● Similar a Swig pero Python como para
más orientado a C++ Incrustar en C++
y casado con Python
● A diferencia de Swig
no requiere de un
lenguaje IDL
adicional.
31. Boost
● Bueno para:
● .. para todo lo anterior, pero con mejoras
significativas como:
– Soporte de funciones virtuales para ser sobreescritas en
Python
– Set completo de herramientas para el manejo de ciclo
de vida de bajo nivel en referencias y punteros
– Soporte para organizar extensiones como paquetes
Python.
– Mecanismos seguros para serialización C++/Python
– Coherencia con las reglas de los manejos de “lvalues
and rvalues” en C++
32. Boost
● Para tener en cuenta:
● Con Boost no requiere otra herramienta más que
su compilador C++ favorito.
● Python y C++ llaman a las mismas cosas de
maneras distintas. Prepare su tabla de
equivalencias
● Python y C++ tienen formas distintas de operar
sus elementos. No traduzca muy literalmente las
interfaces
33. Boost
● Un “Hola Mundo”
#include <boost/python/module.hpp> $ python
#include <boost/python/def.hpp> Python 2.6.6 (r266:84292, Dec 27 2010,
00:02:40)
char const* greet() [GCC 4.4.5] on linux2
{ Type "help", "copyright", "credits" or
return "hello, world"; "license" for more information.
} >>> import hello_ext
>>> print hello.greet()
BOOST_PYTHON_MODULE(hello_ext) hello, world
{ >>>
using namespace boost::python;
def("greet", greet);
}
34. Otros
● “I see death projects”
● ScyPy Weave
● PyInline
● Pyrex
● Estos proyectos
tienen al menos 2
años de inactividad
35. A modo de conclusión
● Es necesario ● Boost es una mejora
conocer la Python/C importante para
API aun cuando no ambientes C++ con
haga uso de ella Python, pero
● Swig es la solución requiere conocer
más popular, por lo mejor C++.
que tiene mejor
documentación y
más ejemplos
36. A modo de conclusión
● A menos que sea ● Python y C++ son
necesario evite amigos
agregar más
elementos a su
ecuación de
integración.
● Nunca optimice
antes de tiempo.
37. Este fue el qué..
..para saber el cómo participe
en el taller del sábado.
38. Gracias por su tiempo..
Licencia del documento: CC BY-NC-SA 3.0
http://creativecommons.org/licenses/by-nc-sa/3.0/