2011-09-24 12 views
5

Sono nuovo di Python Embedding. Sto cercando di incorporare il codice python + numpy all'interno di una funzione di callback C++ (all'interno di una DLL)Incorporamento del codice python + numpy nella callback della DLL C++

il problema che sto affrontando è il seguente. se ho:

Py_Initialize(); 
// some python glue 
// python invocation 
Py_Finalize(); 

tutto funziona correttamente.

ma se devo:

Py_Initialize(); 
_import_array(); //to initialize numpy C-API 
// some python glue + numpy array object creation 
// python invocation via PyObject_CallObject() 
Py_Finalize(); 

questo blocca la seconda volta raggiunge _import_array(); (significa che funziona per la prima richiamata)

se invece eseguo l'inizializzazione python e numpy una sola volta e la finalizzazione nel distruttore (quindi non ogni volta che si inizializza/finalizza), tutto si blocca quando si esce dalla richiamata ..

il problema qui credo sia NumPy, ma non so come risolverlo

+0

Se è possibile controllare appieno come la DLL viene costruito, vorrei peronally lasciare i dettagli a distutils e sorso. Ecco un esempio di progetto (interfacciato con numpy): https://github.com/martinxyz/python/tree/master/realistic – maxy

risposta

1

Prova assicurarsi che la dLL viene inizializzata solo volta, indipendentemente dal numero di volte che il codice è in realtà invocato.

Ecco un link su "C++ Singleton in una DLL":

Singleton in a DLL?

+0

Ciao Paul, grazie per la tua risposta! Quindi, sono abbastanza sicuro che la mia DLL viene inizializzata solo una volta, e infatti, ho omesso di dire che se inizializzo python anche durante l'inizializzazione della mia DLL, e finalizzo nel distruttore, qualcosa di simile funziona bene: ' PyRun_SimpleString (' ' "di volta in volta l'importazione, il ctime \ n" ' ' "dal NumPy import * \ n" ' ' "print 'Oggi è', ctime (time()) \ n" '\t ') ; ' ma se provo a chiamare python tramite PyObject_CallObject(), non funziona più e si blocca quando il callback termina –

+1

Hi-1) Assicurati di inizializzare Python solo UNA VOLTA durante l'esecuzione del programma (e deinitializza no PIÙ di una volta, altrimenti mai). 2) Guarda il codice di esempio martinxyz pubblicato sopra, 3) Guarda questo thread - un problema simile, causato da un errore di conteggio dei riferimenti: http://www.velocityreviews.com/forums/t566237-pyobject_callobject-code-dump-after -calling-4-times.html – paulsm4

+0

Grazie mille Paul, questo link ha aiutato molto! infatti il ​​problema era un DECREF di un oggetto usato da PyTuple_SetItem(). Ora sembra funzionare, ma devo fare alcuni test più estesi, ovviamente! Grazie ancora! –

Problemi correlati