如何解决本机python模块的init函数名称
所以我试图用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]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。