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的引入去掉,一切都正常。请问这是numpy的错误,还是我对引入库的理解有问题?
2 个回答
1
我在模块初始化的部分有这个代码,但这个网址已经不存在了。如果这有帮助的话:
// http://numpy.scipy.org/numpydoc/numpy-13.html mentions this must be done in module init, otherwise we will crash
import_array();
17
来自 Py_Finalize 文档 的内容:
有些扩展如果初始化的过程被调用超过一次,可能会出现问题;这通常发生在一个应用程序多次调用 Py_Initialize() 和 Py_Finalize() 的时候。
显然,Numpy 就是其中之一。你也可以查看 Numpy讨论中的这条消息。
正确的做法是只调用一次 Py_Initialize()
,并在程序结束时进行清理 at exit。这样做应该也会更快!