ho trovato risposte parziali tra la documentazione, mailing list, e this question here, ma volevo ottenere una risposta più diretta affrontare le mie specifiche ...struttura del progetto per il confezionamento di molte classi C++ in Cython ad un singolo oggetto condiviso
Sto imparando il cython cercando di avvolgere piccole parti, a poco a poco, di una libreria che sto già usando che è attualmente inclusa in boost :: python. Ho contribuito un po 'a questo boost wrapper e lo sto usando come riferimento C++, mentre allo stesso tempo sto usando ZeroMQ Python bindings come riferimento cython.
La mia domanda riguarda la struttura del progetto. La versione di potenziamento corrente di questo lib compila in un singolo .so
, e questo è il mio obiettivo. Ho scoperto rapidamente che non è possibile compilare direttamente più moduli .pyx
su un singolo .so
. Ho quindi iniziato a definire la strada per definire i file pxd
e le corrispondenti classi di implementazione esportate da python in .pxi
e stavo cercando di includerli in un singolo pyx
per la compilazione. Mentre funzionava inizialmente, una volta che ho scritto un po 'di più, ho riscontrato problemi con definizioni multiple in conflitto a causa del fatto che lo pxi
include in luoghi diversi.
Mi piacerebbe sentire un approccio organizzativo adeguato che affronta le seguenti domande e gli obiettivi:
- nominare le classi pubbliche lo stesso del
cppclass
(che sto facendo adesso avendo la cppclass in un diverso nomepyd
e utilizzando lo spazio dei nomi importati per gestire i nomi simili, ala Using cimport to resolve naming conflicts) - singolo
.so
come l'uscita compilato (acceptable approach?) - si usa il
pyx
multi-approccio includono nel principalepyx
per quello solo, o dovrebbe che il principalepyx
contenga qualcos'altro oltre a contenere semplicemente gli include? - Dove definire a livello centrale le costanti che verranno esportate in python?
- C'è una struttura di cartelle preferita? In questo momento ho tutto in una grande directory
src
sotto il miosetup.py
. Diventa difficile vedere così tanti filepxi, pxd, pyx
. pxi
sono completamente inutili ora? In caso contrario, ho bisogno di usare un ifndef guard in stile cython per gestire le inclusioni multiple tra diversi moduli?- So che i collegamenti Python ZeroMQ creano più moduli e utilizzano l'approccio del pacchetto includendoli tramite
__init__.py
. E 'davvero l'approccio corretto con cython?
Per riferimento, il progetto che sto praticando per il re-wrap è PyOpenNI (openni). Lo schema utilizzato da questo progetto di potenziamento consiste nel raccogliere gli oggetti comuni in un unico punto e quindi definire una definizione di intestazione 1-a-1 con l'origine, quindi un enorme wrapper che raccoglie tutte le definizioni nella singola posizione. E anche la gestione delle eccezioni e le utility personalizzate.
Puoi indicare il resto del codice che hai creato per questo wrapper? Sto incontrando un problema simile con una risoluzione simile. Non è bello ma funziona. – ibell
Ehi. Quindi questo non era niente che finisse in un repo pubblico. La maggior parte dei miei ultimi esempi di questa struttura non sono online, ma qui ce n'è una che ho seguito poco dopo: https: //github.com/chadmv/plow/tree/master/lib/python/src – jdi
Quello che faccio ora è mantenere i file pxi e includere la sottodirectory per renderla pulita. E ho solo il singolo pyx principale sopra di esso insieme al pxd che contiene tutte le dichiarazioni extern per il binding al C/CPP – jdi