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
импортировать модуль в текущий модуль (в этом случае все еще безопасно использовать украденную ссылку)? Или оба / ни один не правильный способ справиться с этим?