Sam*_*way 18 c python python-extensions
我正在尝试为python编写C扩展.使用代码(如下)我得到编译器警告:
implicit declaration of function ‘Py_InitModule’
Run Code Online (Sandbox Code Playgroud)
它在运行时失败并出现此错误:
undefined symbol: Py_InitModule
Run Code Online (Sandbox Code Playgroud)
我花了几个小时寻找一个没有快乐的解决方案.我尝试过多次语法修改,我甚至发现一篇帖子暗示该方法已被弃用.但是我发现没有替代品.
这是代码:
#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");
}
Run Code Online (Sandbox Code Playgroud)
如果它有帮助,这是我的setup.py:
from distutils.core import setup, Extension
module = Extension('cModPyDem', sources=['cModPyDem.c'])
setup(name = 'packagename',
version='1.0',
description = 'a test package',
ext_modules = [module])
Run Code Online (Sandbox Code Playgroud)
和test.py中的测试代码:
import cModPyDem
if __name__ == '__main__' :
print(cModPyDem.fib(200))
Run Code Online (Sandbox Code Playgroud)
任何帮助都会非常感激.
iCo*_*dez 35
您拥有的代码在Python 2.x中可以正常工作,但Py_InitModule
在Python 3.x中不再使用.现在,您创建一个PyModuleDef
结构,然后将引用传递给它PyModule_Create
.
结构看起来像:
static struct PyModuleDef cModPyDem =
{
PyModuleDef_HEAD_INIT,
"cModPyDem", /* name of module */
"", /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
module_methods
};
Run Code Online (Sandbox Code Playgroud)
然后你的PyMODINIT_FUNC
功能看起来像:
PyMODINIT_FUNC PyInit_cModPyDem(void)
{
return PyModule_Create(&cModPyDem);
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是,名称PyMODINIT_FUNC
功能必须是这样的形式PyInit_<name>
,其中<name>
是你的模块的名称.
我认为如果你阅读Python 3.x文档中的扩展是值得的.它详细描述了如何在现代Python中构建扩展模块.
归档时间: |
|
查看次数: |
11412 次 |
最近记录: |