2011-10-06 14 views
10

Al secondo richiamo del seguente codice, la mia app segfault, quindi credo che mi manca qualcosa:Py_initialize/Py_Finalize non funziona due volte con NumPy

Py_Initialize(); 
pName = PyString_FromString("comp_macbeth"); 
pModule = PyImport_Import(pName); 
Py_DECREF(pName); 

if(pModule == NULL) { 
    PyErr_Print(); 
    Py_Finalize(); 
    return; 
} 

pFunc = PyObject_GetAttrString(pModule, "compute"); 
/* pFunc is a new reference */ 

if (!pFunc || !PyCallable_Check(pFunc)) { 
    PyErr_Print(); 
    Py_Finalize(); 
    return; 
} 

Py_Finalize(); 

Il comp_macbeth.py importa NumPy. Se rimuovo l'importazione numpy, tutto va bene. È un bug insensato o mi manca qualcosa sulle importazioni?

risposta

11

Dal Py_Finalize docs:

Alcuni interni potrebbero non funzionare correttamente se la loro routine di inizializzazione è chiamato più di una volta; questo può accadere se un'applicazione chiama Py_Initialize() e Py_Finalize() più di una volta.

Apparentemente Numpy è uno di quelli. Vedi anche this message dalla discussione di Numpy.

Chiamare Py_Initialize() una sola volta e pulire at exit, è la strada da percorrere. (E dovrebbe essere anche più veloce!)

+0

Non ho bisogno di inizializzare/finalizzare più di una volta, ma volevo controllare se la mia comprensione era corretta – shodanex

0

Ho questo nella parte di inizializzazione del mio modulo, ma l'URL non esiste più. Nel caso in cui aiuti:

// http://numpy.scipy.org/numpydoc/numpy-13.html mentions this must be done in module init, otherwise we will crash 
import_array();