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

时间:2015-12-29 23:26:44

标签: python c integration

我的问题如下: 我想从我的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的错误:未定义的符号

1 个答案:

答案 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; 
}