Как в конечном итоге очистить после PyImport_ImportModule? - PullRequest
0 голосов
/ 27 апреля 2020

API Python C имеет функцию 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;
}

Создает ли функции перемещения / очистки / освобождения правильный способ очистки ( аналогично описанному здесь , но с использованием их вместо ), или лучше просто go опередить и PyModule_AddObject импортировать модуль в текущий модуль (в этом случае все еще безопасно использовать украденную ссылку)? Или оба / ни один не правильный способ справиться с этим?

...