本机 python 模块的初始化函数名称

name of init function of native python module

所以我试图在 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 是模块的名称,并且应该是模块文件中定义的唯一 non-static 项:

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

您还可以在整个 cpython source code(python3)

中找到相同的模式

而在 Extending Python with C or C++ docs(Python2)

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

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

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

#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-extension 的模块名称将是 _fooConvention used to denote [internal c-extension]