he encontrado respuestas parciales entre los documentos, listas de correo, y this question here, pero quería obtener una respuesta más directa frente a mis detalles ...estructura del proyecto para envolver muchas clases ++ c en Cython a un objeto compartido sola
Estoy aprendiendo cython tratando de envolver partes pequeñas, poco a poco, de una biblioteca que ya estoy usando que actualmente está envuelta en boost :: python. He contribuido un poquito a este wrapper boost, y lo estoy usando como referencia de C++, mientras que al mismo tiempo estoy usando ZeroMQ Python bindings como referencia de cython.
Mi pregunta es acerca de la estructura del proyecto. La versión actual de este lib compila a un solo .so
, y ese es mi objetivo. Descubrí rápidamente que no se pueden compilar directamente múltiples módulos .pyx
en un solo .so
. Luego comencé a seguir la ruta de definición de los archivos cppclass
en pxd
, y sus correspondientes clases de implementación exportadas en python en .pxi
, y estaba tratando de incluirlos en un único pyx
para la compilación. Si bien funcionó al principio, una vez que escribí un poco más me tocó problemas con definiciones múltiples en conflicto debido a que el pxi
incluye en diferentes lugares.
Me gustaría escuchar un enfoque organizacional adecuada que responda a las siguientes preguntas y objetivos:
- Denominación de las clases públicas el mismo que el
cppclass
(que estoy haciendo esto ahora por tener el cppclass en un diferente nombrepyd
y utilizando el espacio de nombres importados para manejar los nombres similares, ala Using cimport to resolve naming conflicts) - individual
.so
como la salida compilada (acceptable approach?) - puedo utilizar la
pyx
múltiples incluyen enfoque en el principalpyx
para eso solo, o debería ese principalpyx
contener algo más aparte de solo sostener los includes? - ¿Dónde definir centralmente las constantes que se exportarán en python?
- ¿Existe una estructura de carpetas preferida? En este momento tengo todo en un gran directorio
src
debajo de misetup.py
. Se vuelve confuso ver tantos archivospxi, pxd, pyx
. - ¿Son
pxi
completamente innecesarios ahora? Si no es así, ¿necesito usar un ifndef guard de estilo cython para manejar las inclusiones múltiples entre diferentes módulos? - Sé que los enlaces python ZeroMQ compilan varios módulos y usan el enfoque de paquete incluyéndolos en
__init__.py
. ¿Es realmente el enfoque adecuado con cython?
Como referencia, el proyecto que estoy practicando para volver a envolver es PyOpenNI (openni). El patrón que este proyecto de impulso requiere es recopilar los objetos comunes en un lugar, y luego definir una definición de encabezado 1-a-1 con el origen, y luego hay un envoltorio enorme que recopila todas las definiciones en una sola ubicación. Y también el manejo y las utilidades de excepciones personalizadas adicionales.
¿Puedes indicar el resto del código que has creado para este envoltorio? Me encuentro con un problema similar con una resolución similar. No es agradable, pero funciona. – ibell
Oye. Entonces esto no fue algo que terminó en un repositorio público. La mayoría de mis últimos ejemplos de esta estructura no están en línea, pero he aquí uno que hice poco después: https: //github.com/chadmv/plow/tree/master/lib/python/src – jdi
Lo que hago ahora es Mantenga los archivos pxi dentro e incluya el subdirectorio para hacerlo limpio. Y solo tengo el pyx principal encima, junto con el pxd que contiene todas las declaraciones externas para enlazar con el C/CPP – jdi