通过 Python 调用 C 函数 - 编译后

Calling a C function through Python - after compilation

试图从 Python 调用 c 函数(在之前的 post 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; 
}

如有任何帮助,我们将不胜感激! 谢谢你。

扩展模块中唯一的函数导出到 Python,名称为 modsum。你打电话给 addTwo。这好像是self-explanatory.

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

s = callingPy.modsum(a, b)

看起来你 copy-pasted 一个骨架扩展模块,切换了一个微小的内部,并且没有修复任何导出或名称。