2009-07-02 23 views
5

¿Alguien me puede dar consejos sobre las herramientas o el software que se debe usar para extender Python con C/C++? Gracias.Extendiendo Python con C/C++

+6

Cuando lees http://docs.python.org/c-api/ ¿qué problemas tienes? –

+0

¡Cython es una buena opción para hacer esto! De hecho, escribí una pequeña publicación al respecto, cubriendo todos los detalles desde la escritura de archivos fuente Cython hasta su construcción, escribiendo setup.py - básicamente todo lo que necesitas para envolver una biblioteca C/C++ con Cython: http://martinsosic.com/ desarrollo/2016/02/08/wrapping-c-library-as-python-module.html – Martinsos

Respuesta

8

Usamos SWIG para envolver nuestras bibliotecas C/C++ para su uso en Python. Funciona bastante bien.

http://www.swig.org/

13

página web El Python en sí tiene una gran set of examples, así como API documentation. Eso es literalmente todo lo que usaba cuando necesitaba escribir extensiones C.

+0

+1: Ya está bien documentado. –

+0

oh, pensé que te referías figurativamente, gracias por la aclaración – andrewrk

+0

El código escrito a mano es el mejor si la biblioteca no es extraordinariamente grande (como QT o WxWidgets). – Lothar

2

Sí, es necesario lo siguiente: http://www.python.org/doc/ext/

Y, por supuesto, también es un C/C++.

Si describes lo que estás tratando de hacer, y qué tipo de extensiones estás haciendo, estoy seguro de que las personas pueden darte más información.

Hay cosas como SWIG para envolver bibliotecas, si eso es lo que desea hacer. Si solo quiere aceleraciones, C suele ser la respuesta, pero no siempre, etc.

13

Añadiré la referencia obligatoria al Boost.Python para cosas de C++.

+0

Empecé a usar boost.python hace unos días y ya estoy en funcionamiento. –

3

Hay muchas soluciones. En general, debe evitarlo si es posible, ya que escribir extensiones C es tedioso. A menudo, es necesario utilizar una biblioteca de terceros. En ese caso, creo que la solución ganadora hoy es cython.

Cython es un lenguaje que "se ve como python", pero se puede hacer mucho más rápido mediante el uso de tipeo opcional. Puede llamar directamente a las funciones C, y la mayor parte del recuento de referencias (el problema difícil en las extensiones C) se realiza automáticamente. En mi experiencia, es mucho mejor que boost.python, swig o ctypes:

  • boost.python solo tiene sentido para envolver las extensiones de C++ en mi humilde opinión. Me parece demasiado complicado y difícil de depurar cuando algo sale mal.
  • swig tiene bastante sobrecarga, y no conduce a un buen código. Funciona bien para un par de funciones, pero las extensiones no triviales a menudo utilizan typemaps, y la sintaxis se ponen feas rápidamente

Con Cython, puede utilizar los objetos de Python (lista, dict, etc ...) para envolver su Biblioteca C Por supuesto, también es muy útil si necesita escribir su propia extensión solo por razones de velocidad. En la comunidad científica python, creo que cython se ha convertido en la herramienta de elección cuando se necesita velocidad.

+0

Decir "deberías evitarlo si es posible" sin saber las razones por las cuales OP quiere hacerlo, en primer lugar, está equivocado. Existe una razón por la que Python admite extensiones C, y es porque a veces una extensión C es la mejor solución, en cuyo caso no debe evitarse. También ctypes tiene muchas ventajas sobre cython dependiendo del contexto, sin el cual es erróneo decir que uno es mejor (ver http://stackoverflow.com/questions/1942298/wrapping-ac-library-in-python-c-cython- or-ctypes) – mwag

6

Veo que nadie ha señalado aún una de mis soluciones favoritas para envolver el código C++, SIP (creo que también funciona para envolver C, como SWIG y a diferencia de Boost, pero nunca lo he usado de esa manera). Es la herramienta Riverbank Software desarrollada para hacer PyQt, la interfaz de Python para el maravilloso marco multiplataforma Qt C++, por lo que es una elección natural si su código C++ utiliza cualquier funcionalidad Qt, al igual que Boost Python es la elección natural si su código C++ usa Boost.

SWIG es lo que usamos en el trabajo (una decisión razonable cuando se hizo hace 10 años ;-) y tiene la ventaja teórica de que también puede incluir código C o C++ para usar desde Java, Perl, Tcl, etc. - pero si solo te preocupa Python es difícil ver algo que lo destaque.

Si solo está envolviendo una DLL existente/so, además de Cython, qué otras respuestas han señalado (y lo apruebo, pero - está cambiando muy rápido en estos días, así que tenga cuidado si necesita algo más estable) , considere el módulo de función estándar ctypes - No lo usaría para un trabajo muy extenso (errores "oops" que un compilador de C o C++ podría señalarle pueden causar bloqueos en tiempo de ejecución con ctypes), pero para trabajos pequeños es genial (¡y muy útil ya que viene con distribuciones estándar de Python! -).

La buena API anterior de C no está muerta, acabo de conocerla hoy con Case, el gran chico que ha estado ejecutando la mayor parte del tiempo por mi buen proyecto de código abierto gmpy, y juntos decidimos seguir con la C API para al menos la próxima versión de gmpy: consideraremos cambiar a Cython cuando se estabilice, pero acordamos que el cambio todavía sería un poco prematuro. (¡Ni siquiera pensamos en otra alternativa porque el punto principal de gmpy es ser tan deslumbrantemente rápido como podamos!).

+0

¿Qué opinas sobre Siboken, el equivalente de PySide? http://www.pyside.org/docs/shiboken/ –

+0

@ Craig, aún no lo he probado, tengo la intención de la próxima vez que necesite hacer algo de Qt (por lo que tengo la oportunidad realista de probar PySide). –

+0

Lo siento por el error tipográfico, quise decir "Shiboken". PySide suena prometedor; Solo lamento que tengan que reinventar la rueda. –

3

He usado pycxx en el pasado y realmente he disfrutado de usar esta lib.

En mi opinión, es más fácil de usar que SWIG. Realmente no puedo comparar con boost.python porque nunca he usado boost. Creo que pycxx es más ligero que boost.python, pero puedo estar equivocado.

El punto clave con pycxx es que es un contenedor de C++ de la python c api. Está orientado a objetos y oculta todo el mecanismo difícil. Es bastante intuitivo para un programador python. Es muy fácil de usar y hay algunos buenos ejemplos para comenzar.

Recomiendo pycxx como ciudadano de primera clase para hacer extensión de python en C++.