LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 451|回复: 0

初始化 C 模块

[复制链接]
发表于 2024-2-4 01:37:46 | 显示全部楼层 |阅读模式


模块对象通常是基于扩展模块(导出初始化函数的共享库),或内部编译模块(其中使用 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 版本发生变更: 在模块状态被分配之前不再调用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表