我的问题如下: 我想从我的Python文件中调用一个C函数并将值返回给该Python文件。 我尝试了在Python中使用嵌入式C的以下方法(以下代码是名为&#34的mod代码; mod1.c)。我使用的是Python3.4,因此格式遵循文档指南中给出的格式。当我调用我的安装文件时,问题出现了(下面的第二个代码)。 #包括 #include" sum.h"
static PyObject*
mod_sum(PyObject *self, PyObject *args)
{
int a;
int b;
int s;
if (!PyArg_ParseTuple(args,"ii",&a,&b))
return NULL;
s = sum(a,b);
return Py_BuildValue("i",s);
}
/* DECLARATION OF METHODS */
static PyMethodDef ModMethods[] = {
{"sum", mod_sum, METH_VARARGS, "Descirption"}, // {"methName", modName_methName, METH_VARARGS, "Description.."}, modName is name of module and methName is name of method
{NULL,NULL,0,NULL}
};
// Module Definition Structure
static struct PyModuleDef summodule = {
PyModuleDef_HEAD_INIT,
"sum",
NULL,
-1,
ModMethods
};
/* INITIALIZATION FUNCTION */
PyMODINIT_FUNC initmod(void)
{
PyObject *m;
m = PyModule_Create(&summodule);
if (m == NULL)
return m;
}
Setup.py 来自distutils.core导入设置,扩展
setup(name='buildsum', version='1.0', \
ext_modules=[Extension('buildsum', ['mod1.c'])])
使用gcc编译代码时得到的结果是以下错误: 无法导出PyInit_buildsum:符号未定义
我非常感谢有关此问题的任何见解或帮助,或者有关如何从Python调用C的任何建议。谢谢!
---------------------------------------编辑------- -------------------------- 谢谢你的意见: 我现在尝试了以下内容:
static PyObject*
PyInit_sum(PyObject *self, PyObject *args)
{
int a;
int b;
int s;
if (!PyArg_ParseTuple(args,"ii",&a,&b))
return NULL;
s = sum(a,b);
return Py_BuildValue("i",s);
}
第一个功能;但是,我仍然得到 PyInit_sum的错误:未定义的符号
答案 0 :(得分:1)
上面的工作代码,以防任何人遇到同样的错误:来自@dclarke的答案是正确的。 python 3中的初始化函数必须具有PyInit_(name)作为其名称。
#include <Python.h>
#include "sum.h"
static PyObject* mod_sum(PyObject *self, PyObject *args)
{
int a;
int b;
int s;
if (!PyArg_ParseTuple(args,"ii",&a,&b))
return NULL;
s = sum(a,b);
return Py_BuildValue("i",s);
}
/* DECLARATION OF METHODS*/
static PyMethodDef ModMethods[] = {
{"modsum", mod_sum, METH_VARARGS, "Descirption"},
{NULL,NULL,0,NULL}
};
// Module Definition Structure
static struct PyModuleDef summodule = {
PyModuleDef_HEAD_INIT,"modsum", NULL, -1, ModMethods
};
/* INITIALIZATION FUNCTION*/
PyMODINIT_FUNC PyInit_sum(void)
{
PyObject *m;
m = PyModule_Create(&summodule);
return m;
}