Py_initialize/Py_Finalize не работает дважды с numpy
Во втором вызове следующего кода мое приложение segfault, поэтому, я думаю, что я что-то не хватает:
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();
В comp_macbeth.py импортируется numpy. Если я удалю импорт numpy, все будет в порядке. Является ли это числовой ошибкой, или я что-то пропустил в отношении импорта?
Ответы
Ответ 1
Из Py_Finalize docs:
Некоторые расширения могут работать некорректно, если их процедура инициализации вызывается более одного раза; это может произойти, если приложение вызывает Py_Initialize() и Py_Finalize() более одного раза.
Очевидно, что Numpy является одним из таких. См. Также это сообщение из обсуждения Numpy.
Вызов Py_Initialize()
только один раз и очистка при выходе - это путь. (И это тоже должно быть быстрее!)
Ответ 2
У меня это в моей части инициализации модуля, но URL-адрес больше не существует. Если это помогает:
// http://numpy.scipy.org/numpydoc/numpy-13.html mentions this must be done in module init, otherwise we will crash
import_array();