问题描述
所以我试图用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是模块的名称,并且应该是模块文件中定义的唯一非静态项:
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]