从Python文件调用C函数。 使用Setup.py文件时出错

我的问题如下:我想从我的Python文件中调用一个C函数并将值返回给该Python文件。 我尝试了在Python中使用嵌入式C的以下方法(以下代码是名为“mod1.c”的C代码。我使用的是Python3.4,因此格式遵循文档指南中给出的格式。问题来自于我打电话我的安装文件(下面的第二个代码)。#include #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; } 

来自distutils.core导入设置的Setup.py,Extension

 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); } 

对于第一个function; 但是,我仍然得到PyInit_sum的相同错误:符号未定义

如果有人遇到同样的错误,上面的工作代码:来自@dclarke的答案是正确的。 python 3中的初始化函数必须具有PyInit_(name)作为其名称。

 #include  #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; }