本机 python 模块的初始化函数名称
name of init function of native python module
所以我试图在 C 中制作一个 python 绑定模块,但对 PyMODINIT_FUNC
声明的模块初始化函数的命名规则感到困惑,我已经看到 init_foo
和 initfoo
,而其他人正在使用 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 的模块名称将是 _foo
Convention used to denote [internal c-extension]
所以我试图在 C 中制作一个 python 绑定模块,但对 PyMODINIT_FUNC
声明的模块初始化函数的命名规则感到困惑,我已经看到 init_foo
和 initfoo
,而其他人正在使用 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 的模块名称将是 _foo
Convention used to denote [internal c-extension]