本机python模块的init函数的名称

2024-09-28 20:45:24 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我试图用C语言创建一个python绑定模块,但对模块init函数的命名规则感到困惑,该函数由PyMODINIT_FUNC声明,我看到了init_fooinitfoo,其他人正在使用PyInit_foo,名称重要吗?我应该跟着哪一个

PyMODINIT_FUNC void init_foo(void) {...}
PyMODINIT_FUNC void initfoo(void) {...}
PyMODINIT_FUNC void PyInit_foo(void) {...}

Tags: 模块函数名称声明fooinit规则命名
1条回答
网友
1楼 · 发布于 2024-09-28 20:45:24

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扩展的模块名为_fooConvention used to denote [internal c-api]

相关问题 更多 >