在PyImport\u ImportModule之后如何最终清理?

2024-09-27 07:26:16 发布

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

Python C API具有函数PyImport_ImportModule,该函数返回对模块的新引用。作为一个新的引用,它必须在某个时候被处理掉

在模块初始化期间创建的大多数对象都使用PyModule_AddObject添加到模块中,这会窃取引用(如果成功)。但是,我希望将来自PyImport_ImportModule的模块引用存储在一个全局变量中,以便快速访问。大概是这样的:

#include <Python.h>

static PyObject *imported_module;

static PyModuleDef myextension_module = {
    PyModuleDef_HEAD_INIT,
    .m_name = "myextension",
    .m_doc = "My extension module that uses an imported module",
    .m_size = -1,
};

PyMODINIT_FUNC PyInit_myextension(void)
{
    // ...

    PyObject *m;
    m = PyModule_Create(&md4c_module);
    if (m == NULL) {
        return NULL;
    }

    // ...

    imported_module = PyImport_ImportModule("extratypes");
    if (imported_module == NULL) {
        Py_DECREF(m);
        return NULL;
    }
    // Presumably, imported_module needs to be Py_DECREF'd at some point

    return m;
}

创建遍历/清除/释放函数是清理(similar to how it is described here,但using these instead)的正确方法,还是继续执行并PyModule_AddObject将导入的模块转移到当前模块更好(在这种情况下,使用被盗的引用是否仍然安全)?或者两者都不是正确的处理方法


Tags: 模块函数returnifstaticnullmodulepyobject

热门问题