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();