本机python模块的init函数名称

问题描述

所以我试图用C制作一个python绑定模块,但是对于PyMODINIT_FUNC声明的模块初始化函数的命名规则感到困惑,我已经看到了init_fooinitfoo和其他人正在使用PyInit_foo,这个名称重要吗?我应该遵循哪一个?

PyMODINIT_FUNC void init_foo(void) {...}
PyMODINIT_FUNC void initfoo(void) {...}
PyMODINIT_FUNC void PyInit_foo(void) {...}

解决方法

Extending Python with C or C++ docs(Python3)

初始化函数必须命名为PyInit_name(),其中name是模块的名称,并且应该是模块文件中定义的唯一非静态项:

PyMODINIT_FUNC
PyInit_spam(void)
{
    return PyModule_Create(&spammodule);
}

您还可以在cpython source code(python3)

上找到相同的模式

Extending Python with C or C++ docs(Python2)中的

初始化函数必须命名为initname(),其中name是模块的名称,并且应该是模块文件中定义的唯一非静态项:

PyMODINIT_FUNC
initspam(void)
{
    (void) Py_InitModule("spam",SpamMethods);
}

因此要回答您的问题,名称很重要。如果您要编写与python2和python3都兼容的扩展,则必须像这样实现模块init,

#if PY_MAJOR_VERSION < 3
    PyMODINIT_FUNC
    init_modulename(void)
    {
        return yourmoduleinit();
    }
#else
    PyMODINIT_FUNC
    PyInit_modulename(void)
    {
        return yourmoduleinit();
    }
#endif

注意:PyMODINIT_FUNC void init_foo(void) {...}实际上是python2版本,用于导入此c扩展名的模块名称为_foo Convention used to denote [internal c-api]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...