Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 编译器可以';找不到Py_InitModule()。。它是否已弃用?如果是,我应该使用什么?_Python_C_Python Extensions - Fatal编程技术网

Python 编译器可以';找不到Py_InitModule()。。它是否已弃用?如果是,我应该使用什么?

Python 编译器可以';找不到Py_InitModule()。。它是否已弃用?如果是,我应该使用什么?,python,c,python-extensions,Python,C,Python Extensions,我正在尝试为python编写一个C扩展。通过下面的代码,我得到了编译器警告: implicit declaration of function ‘Py_InitModule’ 它在运行时失败,出现以下错误: undefined symbol: Py_InitModule 我花了几个小时寻找解决方案,但毫无乐趣。我尝试了多次对语法的小改动,甚至发现一篇帖子建议该方法已被弃用。但是我找不到替代品 代码如下: #include <Python.h> //a func to calc

我正在尝试为python编写一个C扩展。通过下面的代码,我得到了编译器警告:

implicit declaration of function ‘Py_InitModule’
它在运行时失败,出现以下错误:

undefined symbol: Py_InitModule
我花了几个小时寻找解决方案,但毫无乐趣。我尝试了多次对语法的小改动,甚至发现一篇帖子建议该方法已被弃用。但是我找不到替代品

代码如下:

#include <Python.h>

//a func to calc fib numbers
int cFib(int n)
{
    if (n<2) return n;
    return cFib(n-1) + cFib(n-2);
}


static PyObject* fib(PyObject* self,PyObject* args)
{
    int n;
    if (!PyArg_ParseTuple(args,"i",&n)) 
        return NULL;    
    return Py_BuildValue("i",cFib(n));
}

static PyMethodDef module_methods[] = {
    {"fib",(PyCFunction) fib, METH_VARARGS,"calculates the fibonachi number"},
    {NULL,NULL,0,NULL}
};

PyMODINIT_FUNC initcModPyDem(void)
{
    Py_InitModule("cModPyDem",module_methods,"a module");
}
以及test.py中的测试代码:

import cModPyDem

if __name__ == '__main__' :

    print(cModPyDem.fib(200))

任何帮助都将不胜感激。

您的代码在Python2.x中运行良好,但Py_InitModule不再在Python3.x中使用。现在,您创建一个结构,然后将其引用传递给

其结构如下所示:

静态结构PyModuleDef cModPyDem=
{
PyModuleDef_HEAD_INIT,
“cModPyDem”,/*模块名称*/
“”、/*模块文档可能为空*/
-1,/*模块的每个解释器状态的大小,如果模块在全局变量中保持状态,则为-1*/
模块法
};
然后您的
PyMODINIT_FUNC
函数将如下所示:

PyMODINIT\u FUNC PyInit\u cModPyDem(void)
{
返回PyModule_Create(&cModPyDem);
}
请注意,
PyMODINIT\u FUNC
函数的名称必须采用
PyInit\u
格式,其中
是模块的名称


我认为如果您阅读Python3.x文档,这将是值得的。它详细描述了如何在现代Python中构建扩展模块。

我在Py_InitModule()中遇到了同样的问题。我从前面提到的Python 3文档开始,特别是“扩展和嵌入Python解释器”文档。但该博士题为“一个简单的例子”的章节遗漏了细节。所以我在谷歌上搜索了这个有趣的讲座:


这在很多方面更适合于Python-C API扩展新手。。。除了它还没有为PythonV3更新之外。所以请参阅scipy讲座、Python 3文档和本StackOverflow讨论,根据您的需要从每个文档中挑选相关信息。

您编译的Python版本是什么?对不起,是的,我使用python3Excellent进行编译-您提供的代码除了一个小的更改之外仍然可以正常工作-Pydonit_FUNC PyInit_cModPyDem(void){}-这是正确的方法。谢谢,是的,值得浏览这些文档。在
中返回PyModule\u Create(&ModPyDem),正确的方法是
返回PyModule\u Create(&cModPyDem)?顺便说一句,这在Python 3.6.8 Ubuntu 18.04中给出了“警告:struct PyModuleDef的'm_slots'字段缺少初始值设定项”。
import cModPyDem

if __name__ == '__main__' :

    print(cModPyDem.fib(200))