Integrar Python y C++
cython (11)
Depende de sus requisitos de portabilidad. He estado luchando con esto por un tiempo, y terminé envolviendo mi C ++ usando la API de python directamente porque necesito algo que funcione en sistemas donde el administrador solo ha pirateado una instalación de gcc y python que funciona en su mayoría.
En teoría, Boost.Python debería ser una muy buena opción, ya que Boost está disponible (casi) en todas partes. Desafortunadamente, si termina en un sistema operativo con una instalación anterior de python (nuestra colaboración está bloqueada con 2.4), se encontrará con problemas si intenta ejecutar Boost.Python con una versión más nueva (todos usamos Python 2.6). Como es probable que su administrador no se haya molestado en instalar una versión de Boost correspondiente a cada versión de Python, tendrá que compilarla usted mismo.
Entonces, si no te molesta que posiblemente necesites una configuración de Boost en cada sistema en el que se ejecute tu código, usa Boost.Python. Si desea un código que definitivamente funcione en cualquier sistema con Python y un compilador de C ++, use la API de Python.
Estoy aprendiendo C ++ porque es un lenguaje muy flexible. Pero para cosas de Internet como Twitter, Facebook, Delicious y otros, Python parece una solución mucho mejor.
¿Es posible integrar C ++ y Python en el mismo proyecto?
He usado PyCxx http://cxx.sourceforge.net/ en el pasado y descubrí que era muy bueno.
Envuelve la API python c de una manera muy elegante y lo hace muy simple de usar. Es muy fácil escribir la extensión de Python en c ++. Se proporciona con ejemplos claros, por lo que es fácil comenzar.
Realmente he disfrutado usando esta biblioteca y la recomiendo.
Interconectar Python con C / C ++ no es una tarea fácil.
Aquí copio / pego una respuesta anterior a una pregunta anterior para los diferentes métodos para escribir una extensión de Python. Con Boost.Python, SWIG, Pybindgen ...
Puede escribir una extensión usted mismo en C o C ++ con Python C-API .
En una palabra: no hagas eso, excepto para aprender a hacerlo. Es muy difícil hacerlo correctamente. Tendrá que incrementar y disminuir las referencias a mano y escribir una gran cantidad de código solo para exponer una función, con muy pocos beneficios.
Swig :
pro: puede generar enlaces para muchos lenguajes de scripting.
contra: no me gusta la forma en que funciona el analizador. No sé si han hecho algún progreso, pero hace dos años el analizador C ++ era bastante limitado. La mayoría de las veces tuve que copiar / pegar mis encabezados .h para agregar algunos
%
caracteres y dar pistas adicionales al analizador de análisis.También necesitaba lidiar con Python C-API de vez en cuando para conversiones de tipo complicadas (no tan).
No lo estoy usando más.
pro: es una biblioteca muy completa. Le permite hacer casi todo lo que es posible con C-API, pero en C ++. Nunca tuve que escribir un código C-API con esta biblioteca. También nunca encontré un error debido a la biblioteca. El código para enlaces funciona como un amuleto o se niega a compilar.
Probablemente sea una de las mejores soluciones actualmente disponibles si ya tiene alguna biblioteca C ++ para vincular. Pero si solo tiene una pequeña función C para reescribir, probablemente lo intente con Cython.
Contras: si no tiene una biblioteca Boost.Python precompilada, va a utilizar Bjam (una especie de reemplazo de marca). Realmente odio Bjam y su sintaxis.
Las bibliotecas de Python creadas con BP tienden a volverse obesas. También lleva mucho tiempo compilarlos.
Py++ : es Boost.Python hecho fácil. Py ++ usa un analizador de C ++ para leer su código y luego genera el código de Boost.Python automáticamente. También tiene un gran apoyo de su autor (no, no soy yo ;-)).
Contras: solo los problemas debidos a Boost.Python.
Editar este proyecto parece discontinuado. Si bien probablemente aún funcione, puede ser mejor considerar cambiar.
Genera el código que trata con el C-API. Puede describir funciones y clases en un archivo Python, o dejar que Pybindgen lea sus encabezados y generar enlaces automáticamente (para esto utiliza pygccxml, una biblioteca python escrita por el autor de Py ++).
contras: es un proyecto joven, con un equipo más pequeño que Boost.Python. Todavía hay algunas limitaciones: no puede exponer sus propias excepciones de C ++, no puede usar herencia múltiple para sus clases de C ++.
De todos modos, ¡vale la pena intentarlo!
Pyrex y Cython :
Aquí no se escribe C / C ++ real sino una mezcla entre Python y C. Este código intermedio generará un módulo Python regular.
Editar 22 de julio de 2013: Ahora Py ++ parece descontinuado, ahora estoy buscando una buena alternativa. Actualmente estoy experimentando con Cython para mi biblioteca C ++. Este lenguaje es una mezcla entre Python y C. Dentro de una función de Cython puede usar entidades Python o C / C ++ (funciones, variables, objetos, ...).
Cython es bastante fácil de aprender, tiene muy buen rendimiento e incluso puede evitar C / C ++ por completo si no tiene que interactuar con las bibliotecas heredadas de C ++.
Sin embargo, para C ++ viene con algunos problemas. Es menos "automático" que Py ++, por lo que probablemente sea mejor para la API C ++ estable (que es ahora el caso de mi biblioteca). El mayor problema que veo con Cython es con el polimorfismo C ++. Con Py ++ / boost: python pude definir un método virtual en C ++, anularlo en Python y llamar a la versión de Python dentro de C ++. Con Cython todavía es factible, pero necesita usar explícitamente la API de C-Python.
Editar 2017-10-06:
Hay uno nuevo, pybind11 , similar a Boost.Python pero con algunas ventajas potenciales. Por ejemplo, utiliza las características del lenguaje C ++ 11 para simplificar la creación de nuevas vinculaciones. También es una biblioteca de solo encabezado, por lo que no hay nada que compilar antes de usarlo, y no hay biblioteca para vincular.
Jugué un poco con él y fue bastante simple y agradable de usar. Mi único temor es que, al igual que Boot.Python, podría generar largas compilaciones y grandes bibliotecas. No he hecho ningún punto de referencia todavía.
Mira esto:
Extendiendo Python con C o C ++
"Es bastante fácil agregar nuevos módulos integrados a Python, si sabes cómo programar en C. Dichos módulos de extensión pueden hacer dos cosas que no se pueden hacer directamente en Python: pueden implementar nuevos tipos de objetos incorporados. y pueden llamar a las funciones de la biblioteca C y a las llamadas al sistema.
Para admitir extensiones, la API de Python (Application Programmers Interface) define un conjunto de funciones, macros y variables que proporcionan acceso a la mayoría de los aspectos del sistema Python en tiempo de ejecución. La API de Python está incorporada en un archivo fuente C al incluir el encabezado "Python.h". "
http://www.python.org/doc/2.5.2/ext/intro.html
PD: se escribe "integrar" :)
Otra forma interesante de hacerlo es la generación de código python ejecutando python para analizar archivos de cabecera de C ++. El equipo de OpenCV tomó este enfoque con éxito y ahora han hecho exactamente lo mismo para hacer el contenedor de Java para la biblioteca OpenCV. Encontré esta API de Python más limpia creada sin limitación causada por una cierta biblioteca.
Prueba Pyrex . Hace que escribir extensiones C ++ para Python sea más fácil.
Puede escribir extensiones de Python en C ++. Básicamente Python está escrito en C y puede usarlo para llamar a su código C. Usted tiene acceso completo a sus objetos de Python. También echa un vistazo a Boost.Python .
Recomiendo ver cómo PyTorch hace su integración.
Sí, es posible, alentado y documented . Lo hice yo mismo y me pareció muy fácil.
Utilizamos Swig mucho éxito en nuestro producto.
Básicamente Swig toma su código C ++ y genera un contenedor de Python alrededor de él.
Manual de referencia de la API de Python / C : la API utilizada por los programadores C y C ++ que desean escribir módulos de extensión o incrustar Python.
Extender e incrustar el intérprete de Python
describe cómo escribir módulos en C o C ++ para extender el intérprete de Python con nuevos módulos. Esos módulos pueden definir nuevas funciones, pero también nuevos tipos de objetos y sus métodos. El documento también describe cómo incrustar el intérprete de Python en otra aplicación, para usar como un lenguaje de extensión. Finalmente, muestra cómo compilar y vincular módulos de extensión para que puedan cargarse dinámicamente (en tiempo de ejecución) en el intérprete, si el sistema operativo subyacente admite esta característica.