para C++ una biblioteca que sean accesibles desde Python debe utilizar nombres de exportación C, lo que básicamente significa que una función llamada foo
será accesible desde ctypes como foo
.
Esto se puede lograr solamente encerrando la interfaz pública con export C {}
, que a su vez no permite la sobrecarga de funciones y plantillas en el mismo (sólo la interfaz pública de la biblioteca para ser envuelto es relevante, el funcionamiento interno no son y pueden utilizar cualquier característica de C++ que les guste).
Motivo para esto es que los compiladores C++ usan un mecanismo llamado name mangling para generar nombres únicos para símbolos sobrecargados o con plantillas. Mientras que ctypes
aún encontraría una función siempre que supiera su nombre destrozado, el esquema de manipulación dependerá del compilador/enlazador que se utilice y no es nada en lo que pueda confiar. En resumen: no use los tipos para envolver las bibliotecas que usan funciones de C++ en su interfaz pública.
Cython
tiene un enfoque diferente. Le ayuda a construir un módulo de extensión C que hace la interfaz con la biblioteca original. Por lo tanto, el enlace a la biblioteca de C++ se realiza mediante el mecanismo de vinculación de C++ regular, evitando así el problema mencionado anteriormente. El problema con Cython es que las librerías de extensión C necesitan ser recompiladas para cada plataforma, pero de todos modos, esto también se aplica a la biblioteca C++.
Personalmente, yo diría que, en la mayoría de los casos, el momento de encender Cython es un tiempo bien empleado que finalmente rendirá en comparación con ctypes (con la excepción de interfaces Cish realmente simples).
No tengo ninguna experiencia con boost.python
, así que no puedo comentar sobre ella (sin embargo, no tengo la impresión de que sea muy popular tampoco).
¡Gracias por mencionar a Cython como una opción! Lo elegí para envolver C api y tuve una experiencia positiva: es como escribir Python con algunas líneas de C en él, y le da mucho control. Una cosa que me costó mucho fue hacer que el proceso de compilación funcionara correctamente: terminé compilando previamente los archivos de Cython antes de crear la distribución de fuente. Si alguien tiene problemas similares, expliqué en detalle cómo envolví mi C api con Cython aquí, incluido el proceso de compilación: http://martinsosic.com/development/2016/02/08/wrapping-c-library-as-python -module.html – Martinsos