Py_initialize / Py_Finalize在使用numpy时无法重复工作

19 投票
2 回答
6386 浏览
提问于 2025-04-17 03:48

在下面的代码第二次调用时,我的应用程序出现了段错误(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。这样做应该也会更快!

撰写回答