Объекты модулей
-
PyTypeObject PyModule_Type -
Часть стабильного ABI.
Этот экземпляр
PyTypeObjectпредставляет тип модуля Python. В программах на Python он доступен какtypes.ModuleType.
-
int PyModule_Check(PyObject *p) -
Возвращает true, если p является объектом модуля или подклассом объекта модуля. Эта функция всегда завершается успешно.
-
int PyModule_CheckExact(PyObject *p) -
Возвращает true, если p является объектом модуля, но не подклассом
PyModule_Type. Эта функция всегда завершается успешно.
-
PyObject *PyModule_NewObject(PyObject *name) -
Возвращаемое значение: новая сильная ссылка. Часть стабильного ABI начиная с версии 3.7.
Возвращает новый объект модуля, у которого
module.__name__установлено в name. Атрибуты__name__,__doc__,__package__и__loader__модуля заполняются (все, кроме__name__, устанавливаются вNone). Вызывающая сторона отвечает за установку атрибута__file__.В случае ошибки возвращает
NULLс установленным исключением.Добавлено в версии 3.3.
Изменено в версии 3.4:
__package__и__loader__теперь устанавливаются вNone.
-
PyObject *PyModule_New(const char *name) -
Возвращаемое значение: новая сильная ссылка. Часть стабильного ABI.
Аналогична
PyModule_NewObject(), но имя передаётся в виде строки в кодировке UTF-8, а не объекта Unicode.
-
PyObject *PyModule_GetDict(PyObject *module) -
Возвращаемое значение: заимствованная ссылка. Часть стабильного ABI.
Возвращает объект словаря, реализующий пространство имён module; этот объект совпадает с атрибутом
__dict__объекта модуля. Если module не является объектом модуля (или подклассом объекта модуля), возникает исключениеSystemErrorи возвращаетсяNULL.Рекомендуется, чтобы расширения использовали другие функции
PyModule_*иPyObject_*, а не изменяли напрямую__dict__модуля.
-
PyObject *PyModule_GetNameObject(PyObject *module) -
Возвращаемое значение: новая сильная ссылка. Часть стабильного ABI начиная с версии 3.7.
Возвращает значение
__name__объекта module. Если модуль не предоставляет это значение или оно не является строкой, возникает исключениеSystemErrorи возвращаетсяNULL.Добавлено в версии 3.3.
-
const char *PyModule_GetName(PyObject *module) -
Часть стабильного ABI.
Аналогична
PyModule_GetNameObject(), но возвращает имя в кодировке'utf-8'.
-
void *PyModule_GetState(PyObject *module) -
Часть стабильного ABI.
Возвращает «состояние» модуля, то есть указатель на блок памяти, выделенный при создании модуля, либо
NULL. См.PyModuleDef.m_size.
-
PyModuleDef *PyModule_GetDef(PyObject *module) -
Часть стабильного ABI.
Возвращает указатель на структуру
PyModuleDef, из которой был создан модуль, либоNULL, если модуль был создан не на основе определения.
-
PyObject *PyModule_GetFilenameObject(PyObject *module) -
Возвращаемое значение: новая сильная ссылка. Часть стабильного ABI.
Возвращает имя файла, из которого был загружен module, используя атрибут
__file__объекта module. Если этот атрибут не определён или не является строкой, возникает исключениеSystemErrorи возвращаетсяNULL; в противном случае возвращается ссылка на объект Unicode.Добавлено в версии 3.2.
-
const char *PyModule_GetFilename(PyObject *module) -
Часть стабильного ABI.
Аналогична
PyModule_GetFilenameObject(), но возвращает имя файла в кодировке «utf-8».Устарела с версии 3.2:
PyModule_GetFilename()вызывает исключениеUnicodeEncodeError, если имя файла невозможно закодировать. Вместо неё используйтеPyModule_GetFilenameObject().
Инициализация модулей C
Объекты модулей обычно создаются из модулей расширения (разделяемых библиотек, экспортирующих функцию инициализации) или встроенных модулей (где функция инициализации добавляется с помощью PyImport_AppendInittab()). Подробнее см. в разделах Создание расширений на C и C++ и Расширение встроенного Python.
Функция инициализации может передать экземпляр определения модуля в PyModule_Create() и вернуть полученный объект модуля либо запросить «многоэтапную инициализацию», вернув саму структуру определения.
-
type PyModuleDef -
Входит в стабильный ABI (включая все члены).
Структура определения модуля, содержащая всю информацию, необходимую для создания объекта модуля. Обычно для каждого модуля существует только одна статически инициализированная переменная этого типа.
-
PyModuleDef_Base m_base -
Всегда инициализируйте этот член значением
PyModuleDef_HEAD_INIT.
-
const char *m_name -
Имя нового модуля.
-
const char *m_doc -
Строка документации модуля; обычно используется переменная строки документации, созданная с помощью
PyDoc_STRVAR.
-
Py_ssize_t m_size -
Состояние модуля можно хранить в области памяти, выделенной для каждого модуля, которую можно получить с помощью
PyModule_GetState(), а не в статических глобальных переменных. Это позволяет безопасно использовать модули в нескольких субинтерпретаторах.Эта область памяти выделяется при создании модуля на основе значения m_size и освобождается при освобождении объекта модуля после вызова функции
m_free, если она задана.Значение
m_size, равное-1, означает, что модуль не поддерживает субинтерпретаторы, поскольку содержит глобальное состояние.Установка неотрицательного значения означает, что модуль можно инициализировать повторно, а также задаёт дополнительный объём памяти, необходимый для его состояния. Для многоэтапной инициализации требуется неотрицательное значение
m_size.Подробнее см. в PEP 3121.
-
PyMethodDef *m_methods -
Указатель на таблицу функций уровня модуля, описанных значениями
PyMethodDef. Может быть равенNULL, если функции отсутствуют.
-
PyModuleDef_Slot *m_slots -
Массив определений слотов для многоэтапной инициализации, завершающийся записью
{0, NULL}. При одноэтапной инициализации m_slots должен быть равенNULL.Изменено в версии 3.5: До версии 3.5 этот член всегда устанавливался в
NULLи определялся следующим образом:-
inquiry m_reload
-
-
traverseproc m_traverse -
Функция обхода, вызываемая при обходе объекта модуля сборщиком мусора, или
NULL, если она не требуется.Эта функция не вызывается, если состояние модуля было запрошено, но ещё не выделено. Так происходит сразу после создания модуля и до выполнения модуля (функции
Py_mod_exec). Точнее, функция не вызывается, если значениеm_sizeбольше 0, а состояние модуля (возвращаемоеPyModule_GetState()) равноNULL.Изменено в версии 3.9: Больше не вызывается до выделения состояния модуля.
-
inquiry m_clear -
Функция очистки, вызываемая при очистке объекта модуля сборщиком мусора, или
NULL, если она не требуется.Эта функция не вызывается, если состояние модуля было запрошено, но ещё не выделено. Так происходит сразу после создания модуля и до выполнения модуля (функции
Py_mod_exec). Точнее, функция не вызывается, если значениеm_sizeбольше 0, а состояние модуля (возвращаемоеPyModule_GetState()) равноNULL.Как и
PyTypeObject.tp_clear, эта функция вызывается не всегда до освобождения модуля. Например, когда подсчёта ссылок достаточно, чтобы определить, что объект больше не используется, циклический сборщик мусора не задействуется, аm_freeвызывается напрямую.Изменено в версии 3.9: Больше не вызывается до выделения состояния модуля.
-
freefunc m_free -
Функция, вызываемая при освобождении объекта модуля, или
NULL, если она не требуется.Эта функция не вызывается, если состояние модуля было запрошено, но ещё не выделено. Так происходит сразу после создания модуля и до выполнения модуля (функции
Py_mod_exec). Точнее, функция не вызывается, если значениеm_sizeбольше 0, а состояние модуля (возвращаемоеPyModule_GetState()) равноNULL.Изменено в версии 3.9: Больше не вызывается до выделения состояния модуля.
-
Одноэтапная инициализация
Функция инициализации модуля может создать объект модуля и вернуть его напрямую. Это называется «одноэтапной инициализацией»; при ней используется одна из двух следующих функций создания модуля:
-
PyObject *PyModule_Create(PyModuleDef *def) -
Возвращаемое значение: новая ссылка.
Создаёт новый объект модуля на основе определения def. Работает как
PyModule_Create2(), где для module_api_version задано значениеPYTHON_API_VERSION.
-
PyObject *PyModule_Create2(PyModuleDef *def, int module_api_version) -
Возвращаемое значение: новая ссылка.Входит в стабильный ABI.
Создаёт новый объект модуля на основе определения def, предполагая версию API module_api_version. Если эта версия не совпадает с версией работающего интерпретатора, выдаётся предупреждение
RuntimeWarning.При ошибке возвращает
NULLс установленным исключением.Примечание
В большинстве случаев следует использовать эту функцию:
PyModule_Create(); используйте данную функцию, только если уверены, что она вам нужна.
Перед возвратом объекта из функции инициализации полученный объект модуля обычно заполняется с помощью таких функций, как PyModule_AddObjectRef().
Многоэтапная инициализация
Другой способ задания модулей расширения — запросить «многоэтапную инициализацию». Созданные таким образом модули расширения ведут себя более похоже на модули Python: инициализация разделена на этап создания, на котором создаётся объект модуля, и этап выполнения, на котором он заполняется. Это различие аналогично методам __new__() и __init__() классов.
В отличие от модулей, созданных с помощью одноэтапной инициализации, такие модули не являются синглтонами. Например, если удалить запись sys.modules и импортировать модуль повторно, будет создан новый объект модуля, обычно заполненный новыми объектами методов и типов. Старый модуль подлежит обычной сборке мусора. Такое поведение соответствует поведению модулей на чистом Python.
Дополнительные экземпляры модуля могут создаваться в субинтерпретаторах или после повторной инициализации среды выполнения Python (Py_Finalize() и Py_Initialize()). В этих случаях совместное использование объектов Python экземплярами модуля, вероятно, приведёт к сбоям или неопределённому поведению.
Чтобы избежать подобных проблем, каждый экземпляр модуля расширения должен быть изолирован: изменения одного экземпляра не должны неявно влиять на остальные, а всё состояние, включая ссылки на объекты Python, должно относиться к конкретному экземпляру модуля. Подробнее и практическое руководство см. в разделе Изоляция модулей расширения.
Более простой способ избежать подобных проблем — выдавать ошибку при повторной инициализации.
Предполагается, что все модули, созданные с помощью многоэтапной инициализации, поддерживают субинтерпретаторы или явно сообщают об отсутствии такой поддержки. Обычно этого достигают изоляцией или запретом повторной инициализации, как описано выше. Модуль также можно ограничить основным интерпретатором с помощью слота Py_mod_multiple_interpreters.
Чтобы запросить многоэтапную инициализацию, функция инициализации (PyInit_modulename) возвращает экземпляр PyModuleDef с непустым m_slots. Перед возвратом экземпляр PyModuleDef необходимо инициализировать следующей функцией:
-
PyObject *PyModuleDef_Init(PyModuleDef *def) -
Возвращаемое значение: заимствованная ссылка.Входит в стабильный ABI начиная с версии 3.5.
Гарантирует, что определение модуля является правильно инициализированным объектом Python и корректно сообщает свой тип и счётчик ссылок.
Возвращает def, приведённый к типу
PyObject*, илиNULL, если произошла ошибка.Добавлено в версии 3.5.
Член m_slots определения модуля должен указывать на массив структур PyModuleDef_Slot:
-
type PyModuleDef_Slot -
-
int slot -
Идентификатор слота, выбранный из доступных значений, описанных ниже.
-
void *value -
Значение слота, смысл которого зависит от идентификатора слота.
Добавлено в версии 3.5.
-
Массив m_slots должен завершаться слотом с идентификатором 0.
Доступны следующие типы слотов:
-
Py_mod_create -
Задаёт функцию, вызываемую для создания самого объекта модуля. Указатель value этого слота должен указывать на функцию со следующей сигнатурой:
-
PyObject *create_module(PyObject *spec, PyModuleDef *def)
Функция получает экземпляр
ModuleSpec, определённый в PEP 451, и определение модуля. Она должна вернуть новый объект модуля либо установить ошибку и вернутьNULL.Эта функция должна быть минимальной. В частности, ей не следует вызывать произвольный код Python, поскольку попытка повторно импортировать тот же модуль может привести к бесконечному циклу.
В одном определении модуля нельзя указать несколько слотов
Py_mod_create.Если
Py_mod_createне указан, механизм импорта создаст обычный объект модуля с помощьюPyModule_New(). Имя берётся из spec, а не из определения, что позволяет модулям расширения динамически подстраиваться под своё место в иерархии модулей и импортироваться под разными именами через символические ссылки, при этом используя одно определение модуля.Возвращаемый объект не обязательно должен быть экземпляром
PyModule_Type. Можно использовать любой тип, если он поддерживает установку и получение атрибутов, связанных с импортом. Однако возвращать можно только экземплярыPyModule_Type, еслиPyModuleDefсодержит неравныеNULLm_traverse,m_clear,m_free; ненулевойm_size; или слоты, отличные отPy_mod_create. -
-
Py_mod_exec -
Задаёт функцию, вызываемую для выполнения модуля. Это эквивалентно выполнению кода модуля Python: обычно эта функция добавляет в модуль классы и константы. Сигнатура функции:
-
int exec_module(PyObject *module)
Если указано несколько слотов
Py_mod_exec, они обрабатываются в порядке следования в массиве m_slots. -
-
Py_mod_multiple_interpreters -
Задаёт одно из следующих значений:
-
Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED -
Модуль не поддерживает импорт в субинтерпретаторах.
-
Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED -
Модуль поддерживает импорт в субинтерпретаторах, но только если они используют GIL основного интерпретатора совместно. (См. раздел Изоляция модулей расширения.)
-
Py_MOD_PER_INTERPRETER_GIL_SUPPORTED -
Модуль поддерживает импорт в субинтерпретаторах, даже если у них собственный GIL. (См. раздел Изоляция модулей расширения.)
Этот слот определяет, завершится ли ошибкой импорт данного модуля в субинтерпретаторе.
В одном определении модуля нельзя указать несколько слотов
Py_mod_multiple_interpreters.Если
Py_mod_multiple_interpretersне указан, механизм импорта по умолчанию используетPy_MOD_MULTIPLE_INTERPRETERS_SUPPORTED.Добавлено в версии 3.12.
-
-
Py_mod_gil -
Задаёт одно из следующих значений:
-
Py_MOD_GIL_USED -
Модуль зависит от наличия глобальной блокировки интерпретатора (GIL) и может обращаться к глобальному состоянию без синхронизации.
-
Py_MOD_GIL_NOT_USED -
Модуль безопасно работает без активной GIL.
Этот слот игнорируется сборками Python, сконфигурированными без
--disable-gil. В противном случае он определяет, приведёт ли импорт данного модуля к автоматическому включению GIL. Подробнее см. в разделе CPython без потоковой блокировки.В одном определении модуля нельзя указать несколько слотов
Py_mod_gil.Если
Py_mod_gilне указан, механизм импорта по умолчанию используетPy_MOD_GIL_USED.Добавлено в версии 3.13.
-
Подробнее о многоэтапной инициализации см. в PEP 489.
Низкоуровневые функции создания модулей
Следующие функции вызываются «под капотом» при многоэтапной инициализации. Их можно использовать напрямую, например, при динамическом создании объектов модулей. Обратите внимание: для полной инициализации модуля необходимо вызвать и PyModule_FromDefAndSpec, и PyModule_ExecDef.
-
PyObject *PyModule_FromDefAndSpec(PyModuleDef *def, PyObject *spec) -
Возвращаемое значение: новая ссылка.
Создаёт новый объект модуля на основе определения def и ModuleSpec spec. Работает как
PyModule_FromDefAndSpec2(), где для module_api_version задано значениеPYTHON_API_VERSION.Добавлено в версии 3.5.
-
PyObject *PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version) -
Возвращаемое значение: новая ссылка.Входит в стабильный ABI начиная с версии 3.7.
Создаёт новый объект модуля на основе определения def и ModuleSpec spec, предполагая версию API module_api_version. Если эта версия не совпадает с версией работающего интерпретатора, выдаётся предупреждение
RuntimeWarning.При ошибке возвращает
NULLс установленным исключением.Примечание
В большинстве случаев следует использовать эту функцию:
PyModule_FromDefAndSpec(); используйте данную функцию, только если уверены, что она вам нужна.Добавлено в версии 3.5.
-
int PyModule_ExecDef(PyObject *module, PyModuleDef *def) -
Входит в стабильный ABI начиная с версии 3.7.
Обрабатывает все слоты выполнения (
Py_mod_exec), заданные в def.Добавлено в версии 3.5.
-
int PyModule_SetDocString(PyObject *module, const char *docstring) -
Входит в стабильный ABI начиная с версии 3.7.
Задаёт для module строку документации docstring. Эта функция вызывается автоматически при создании модуля из
PyModuleDefс помощьюPyModule_CreateилиPyModule_FromDefAndSpec.Добавлено в версии 3.5.
-
int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions) -
Входит в стабильный ABI начиная с версии 3.7.
Добавляет функции из массива functions, завершающегося
NULL, в module. Подробные сведения об отдельных записях см. в документацииPyMethodDef(из-за отсутствия общего пространства имён модулей «функции» уровня модуля, реализованные на C, обычно получают модуль в качестве первого параметра, поэтому они похожи на методы экземпляра в классах Python). Эта функция вызывается автоматически при создании модуля изPyModuleDefс помощьюPyModule_CreateилиPyModule_FromDefAndSpec.Добавлено в версии 3.5.
Вспомогательные функции
Функция инициализации модуля (при использовании однофазной инициализации) или функция, вызываемая из слота выполнения модуля (при использовании многофазной инициализации), может использовать следующие функции для упрощения инициализации состояния модуля:
-
int PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value) -
Входит в стабильный ABI начиная с версии 3.10.
Добавляет объект в module под именем name. Эта вспомогательная функция может использоваться из функции инициализации модуля.
В случае успеха возвращает
0. В случае ошибки вызывает исключение и возвращает-1.Пример использования:
static int add_spam(PyObject *module, int value) { PyObject *obj = PyLong_FromLong(value); if (obj == NULL) { return -1; } int res = PyModule_AddObjectRef(module, "spam", obj); Py_DECREF(obj); return res; }Для удобства функция принимает
NULLvalue при установленном исключении. В этом случае возвращается-1, а вызванное исключение остаётся без изменений.Пример также можно записать без явной проверки, является ли obj
NULL:static int add_spam(PyObject *module, int value) { PyObject *obj = PyLong_FromLong(value); int res = PyModule_AddObjectRef(module, "spam", obj); Py_XDECREF(obj); return res; }Обратите внимание, что в этом случае следует использовать
Py_XDECREF()вместоPy_DECREF(), поскольку obj может бытьNULL.Количество различных строк name, передаваемых этой функции, следует свести к минимуму, обычно используя в качестве name только статически размещённые строки. Для имён, неизвестных на этапе компиляции, предпочтительно напрямую вызывать
PyUnicode_FromString()иPyObject_SetAttr(). Дополнительные сведения см. в описанииPyUnicode_InternFromString(), которую можно использовать внутри для создания объекта-ключа.Добавлено в версии 3.10.
-
int PyModule_Add(PyObject *module, const char *name, PyObject *value) -
Входит в стабильный ABI начиная с версии 3.13.
Аналогична
PyModule_AddObjectRef(), но «забирает» ссылку на value. Её можно вызвать с результатом функции, возвращающей новую ссылку, не проверяя результат и даже не сохраняя его в переменную.Пример использования:
if (PyModule_Add(module, "spam", PyBytes_FromString(value)) < 0) { goto error; }Добавлено в версии 3.13.
-
int PyModule_AddObject(PyObject *module, const char *name, PyObject *value) -
Входит в стабильный ABI.
Аналогична
PyModule_AddObjectRef(), но в случае успеха (если возвращает0) забирает ссылку на value.Рекомендуется использовать новые функции
PyModule_Add()илиPyModule_AddObjectRef(), поскольку при неправильном использовании функцииPyModule_AddObject()легко допустить утечку ссылок.Примечание
В отличие от других функций, забирающих ссылки,
PyModule_AddObject()освобождает ссылку на value только в случае успеха.Это означает, что необходимо проверять возвращаемое значение, а вызывающий код в случае ошибки должен вручную вызвать
Py_XDECREF()для value.Пример использования:
PyObject *obj = PyBytes_FromString(value); if (PyModule_AddObject(module, "spam", obj) < 0) { // If 'obj' is not NULL and PyModule_AddObject() failed, // 'obj' strong reference must be deleted with Py_XDECREF(). // If 'obj' is NULL, Py_XDECREF() does nothing. Py_XDECREF(obj); goto error; } // PyModule_AddObject() stole a reference to obj: // Py_XDECREF(obj) is not needed here.Устарела начиная с версии 3.13:
PyModule_AddObject()имеет статус условно устаревшей.
-
int PyModule_AddIntConstant(PyObject *module, const char *name, long value) -
Входит в стабильный ABI.
Добавляет целочисленную константу в module под именем name. Эта вспомогательная функция может использоваться из функции инициализации модуля. В случае ошибки возвращает
-1с установленным исключением, в случае успеха —0.Это вспомогательная функция, которая вызывает
PyLong_FromLong()иPyModule_AddObjectRef(); подробности см. в их документации.
-
int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value) -
Входит в стабильный ABI.
Добавляет строковую константу в module под именем name. Эта вспомогательная функция может использоваться из функции инициализации модуля. Строка value должна заканчиваться
NULL. В случае ошибки возвращает-1с установленным исключением, в случае успеха —0.Это вспомогательная функция, которая вызывает
PyUnicode_InternFromString()иPyModule_AddObjectRef(); подробности см. в их документации.
-
PyModule_AddIntMacro(module, macro) -
Добавляет целочисленную константу в module. Имя и значение берутся из macro. Например,
PyModule_AddIntMacro(module, AF_INET)добавляет в module целочисленную константу AF_INET со значением AF_INET. В случае ошибки возвращает-1с установленным исключением, в случае успеха —0.
-
PyModule_AddStringMacro(module, macro) -
Добавляет строковую константу в module.
-
int PyModule_AddType(PyObject *module, PyTypeObject *type) -
Входит в стабильный ABI начиная с версии 3.10.
Добавляет объект типа в module. Объект типа подготавливается посредством внутреннего вызова
PyType_Ready(). Имя объекта типа берётся из последнего компонентаtp_nameпосле точки. В случае ошибки возвращает-1с установленным исключением, в случае успеха —0.Добавлено в версии 3.9.
-
int PyUnstable_Module_SetGIL(PyObject *module, void *gil) -
Это нестабильный API. Он может изменяться без предупреждения в минорных выпусках.
Указывает, поддерживает ли module работу без глобальной блокировки интерпретатора (GIL), используя одно из значений
Py_mod_gil. Функцию необходимо вызвать во время инициализации module. Если во время инициализации модуля эта функция не вызывается, механизм импорта считает, что модуль не поддерживает работу без GIL. Эта функция доступна только в сборках Python, настроенных с параметром--disable-gil. В случае ошибки возвращает-1с установленным исключением, в случае успеха —0.Добавлено в версии 3.13.
Поиск модулей
При однофазной инициализации создаются модули-одиночки, которые можно найти в контексте текущего интерпретатора. Это позволяет позднее получить объект модуля, имея только ссылку на определение модуля.
Эти функции не работают с модулями, созданными посредством многофазной инициализации, поскольку из одного определения можно создать несколько таких модулей.
-
PyObject *PyState_FindModule(PyModuleDef *def) -
Возвращаемое значение: заимствованная ссылка. Входит в стабильный ABI.
Возвращает объект модуля, созданный из def для текущего интерпретатора. Для этого метода необходимо, чтобы объект модуля был предварительно присоединён к состоянию интерпретатора с помощью
PyState_AddModule(). Если соответствующий объект модуля не найден или ещё не присоединён к состоянию интерпретатора, возвращаетсяNULL.
-
int PyState_AddModule(PyObject *module, PyModuleDef *def) -
Входит в стабильный ABI начиная с версии 3.3.
Присоединяет переданный функции объект модуля к состоянию интерпретатора. Это позволяет получить доступ к объекту модуля через
PyState_FindModule().Действует только для модулей, созданных посредством однофазной инициализации.
Python автоматически вызывает
PyState_AddModuleпосле импорта модуля, поэтому вызывать её из кода инициализации модуля необязательно (но это не повредит). Явный вызов требуется только в том случае, если собственный код инициализации модуля впоследствии вызываетPyState_FindModule. Эта функция предназначена главным образом для реализации альтернативных механизмов импорта (как при прямом вызове, так и при изучении её реализации, чтобы узнать, какие обновления состояния требуются).Вызывающий код должен удерживать GIL.
В случае ошибки возвращает
-1с установленным исключением, в случае успеха —0.Добавлено в версии 3.3.
-
int PyState_RemoveModule(PyModuleDef *def) -
Входит в стабильный ABI начиная с версии 3.3.
Удаляет из состояния интерпретатора объект модуля, созданный из def. В случае ошибки возвращает
-1с установленным исключением, в случае успеха —0.Вызывающий код должен удерживать GIL.
Добавлено в версии 3.3.
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/c-api/module.html