为什么PyImport_ImportModule返回refcount为3而不是1的PyObject*

2024-04-24 06:54:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在我的C++程序中使用python C API,我注意到一个奇怪的事情。在

在我的电脑调试器中运行类似这样的简单程序时:

int main(int argc, const char * argv[]) {

    Py_Initialize();
    PyObject* scipy_stats_module = PyImport_ImportModule("scipy.stats"); // importing "scipy.stats" module

    Py_DecRef(scipy_stats_module);

    if (Py_FinalizeEx() < 0) {
        PyErr_Print();
        exit(-1);
    }

    return 0;

}

我看到了scipy_stats_moduleob_refcnt属性,在它创建之后,在调用Py_DecRef之前,被设置为3,而我希望它等于1。在

有人能帮我理解为什么会这样吗?这是我的代码有问题还是很正常?我应该打三次电话还是只打一次?在

谢谢你!在

另外,我用xcode8.3.3作为IDE和调试器,在我的macos10.12.5上运行


Tags: py程序apimainstatsscipy事情调试器
1条回答
网友
1楼 · 发布于 2024-04-24 06:54:07

你不是新模块的唯一引用。在本例中,识别其他引用很简单—一个是sys.modules['scipy.stats'],一个是scipy模块对象的stats属性,一般来说,您不关心模块可能有哪些其他引用。在

当您清除对模块的引用时,您应该只Py_DECREF一次,因为您只清除了一个引用,即您自己的引用。其他引用仍然存在,仍然需要在refcount中进行说明。在

相关问题 更多 >