微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

本机python模块的init函数名称

如何解决本机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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。