【问题标题】:Calling a C function through Python - after compilation通过 Python 调用 C 函数 - 编译后
【发布时间】:2015-12-30 09:40:50
【问题描述】:

为了尝试从 Python 调用 c 函数(在之前的帖子 Calling a C function from a Python file. Getting error when using Setup.py file 中),我已将代码编译为 .pyd 文件并正在测试该程序。 但是,我遇到了错误

AttributeError: 'module' object has no attribute 'addTwo'

我的测试文件是这样的:

import callingPy
a = 3
b = 4
s = callingPy.addTwo(a, b)
print("S", s)

其中callingPy是下面的.c文件(通过编译变成.pyd):

#include <Python.h>
#include "adder.h"

static PyObject* adder(PyObject *self, PyObject *args)       
{
    int a;
    int b;
    int s;
    if (!PyArg_ParseTuple(args,"ii",&a,&b))                      
       return NULL;
    s = addTwo(a,b);                                                
    return Py_BuildValue("i",s);                                
}

/* DECLARATION OF METHODS*/
static PyMethodDef ModMethods[] = {
    {"modsum", adder, 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_callingPy(void)
{
    PyObject *m;
    m = PyModule_Create(&summodule);
    return m; 
}

任何帮助将不胜感激! 谢谢你。

【问题讨论】:

  • 在您发布的 C 代码中我没有看到 addTwo 函数。
  • @David Hoelzer:addTwo 函数在另一个文件中,原型在头函数“Adder.h”中定义
  • 您的编译器错误往往与您不同。

标签: python c multiple-languages


【解决方案1】:

扩展模块中的唯一函数以名称modsum 导出到Python。你打电话给addTwo。这似乎不言自明。

看起来在 C 层,有一个名为 addTwo 的原始 C 函数为 C 函数 adder 工作,然后以 modsum 的名称导出到 Python。因此,您应该重命名导出,或者使用正确的名称调用它:

s = callingPy.modsum(a, b)

看起来您复制粘贴了一个骨架扩展模块,切换了一个很小的内部模块,并且没有修复任何导出或名称。

【讨论】:

  • 感谢您的评论,尽管我复制粘贴了一个骨架扩展模块是错误的。我确实遵循了一个示例,但我自己从那个示例中编写了它,所以我知道发生了什么。但是,您是对的,导入名称必须是编译我的 python 代码的 function.c 文件,而函数名称必须是我的 python 方法名称。谢谢!
  • @smallfacebigmouth:不客气。我的骨架副本猜测基于代码实际上也将模块命名为 modsum,即使生成的文件名为 callingPy.OSSPECIFICEXTENSION 并导入为 callingPy。它看起来很像一个为模求和而编写的模块,后来换成了一个更简单的函数。当字符串不是预期命名或功能的一部分时,您会看到散布在各处的相同字符串,并且您做出假设。 :-)
  • 是的。我想我仍在尝试习惯从 python 调用 c 的概念 :) 再次感谢您的帮助!我很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多