问题 Py_initialize / Py_Finalize没有使用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();

comp_macb.py正在导入numpy。如果我删除numpy导入,一切都很好。这是一个numpy bug,还是我错过了一些关于进口的东西?


8594
2017-10-06 15:02


起源



答案:


来自 Py_Finalize文档

如果多次调用初始化例程,某些扩展可能无法正常工作;如果应用程序多次调用Py_Initialize()和Py_Finalize(),就会发生这种情况。

显然Numpy就是其中之一。也可以看看 这条信息 来自Numpy讨论。

调用 Py_Initialize() 只有一次,清理 在出口处,是要走的路。 (它也应该更快!)


11
2017-10-06 15:46



我不需要多次初始化/终结,但我想检查一下我的理解是否正确 - shodanex


答案:


来自 Py_Finalize文档

如果多次调用初始化例程,某些扩展可能无法正常工作;如果应用程序多次调用Py_Initialize()和Py_Finalize(),就会发生这种情况。

显然Numpy就是其中之一。也可以看看 这条信息 来自Numpy讨论。

调用 Py_Initialize() 只有一次,清理 在出口处,是要走的路。 (它也应该更快!)


11
2017-10-06 15:46



我不需要多次初始化/终结,但我想检查一下我的理解是否正确 - shodanex


我在模块初始化部分有这个,但URL不再存在。如果有帮助:

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

0
2017-10-06 18:56