Python/C API-结果不显示

Python/C API-结果不显示,python,c,python-3.x,python-c-api,Python,C,Python 3.x,Python C Api,我想在Python中集成C模块,因此我选择了接口Python.h。所有的东西都没有错误和警告,所以我不明白问题出在哪里 丙方: #包括 ... #定义PyInt_AsLong(x)(PyLong_AsLong((x))) typedef PyObject*Py; 静态Py getSumma(Py self,pyargs){ Py-nums; if(!PyArg_ParseTuple(args,“O”和nums)){ 返回NULL; } 尺寸=PyList尺寸(args); int32_t sum

我想在Python中集成C模块,因此我选择了接口
Python.h
。所有的东西都没有错误和警告,所以我不明白问题出在哪里

丙方:

#包括
...
#定义PyInt_AsLong(x)(PyLong_AsLong((x)))
typedef PyObject*Py;
静态Py getSumma(Py self,pyargs){
Py-nums;
if(!PyArg_ParseTuple(args,“O”和nums)){
返回NULL;
}
尺寸=PyList尺寸(args);
int32_t summa=0;
对于(大小i=0;i
setup.py:

来自distutils.core导入设置,扩展
SummaLogic=扩展(“SummaLogic”,sources=['SummaLogic.c'])
设置(ext_模块=[SummaLogic])
Python方面:

from SummaLogic import getSumma

if __name__ == "__main__":
    a = [1, 2, 3]
    b = getSumma(a)
    print(b)
这似乎是对的,但当我在终端启动它时,什么都没有发生,只是挂在那里没有任何活动。我会错过什么?

归根结底,就是你没有检查错误

您可能希望在
nums
上使用它,而不是将
args
用作参数。但是,您在
args
上使用了,发生了一件非常有趣的事情:

  • args
    是一个
    元组
  • 因此,
    PyList\u Size
    失败并返回
  • -1
    被转换为无符号的
    大小
    ,这可能导致一个非常大的数字,可能是
    2**64-1
  • 因此,您的迭代运行“非常长的时间”,因为迭代
    2**64-1
    项需要相当长的时间(除了所有的越界内存访问)
快速解决方法是使用:

Py_ssize_t listlength=PyList_Size(nums);/*nums而不是args*/
如果(listlength==-1){/*检查错误*/
返回NULL;
}
size\u t numsAmount=(size\t)listlength/*仅在检查错误后转换为size\t*/

然而,您应该检查错误条件是什么,并在每次python C API函数调用后测试它们,否则您将得到许多未定义的行为。另外,我可能会坚持使用定义的返回类型,而不是
int32\u t
PyInt\u AsLong
returns
long
,因此也可能会出现奇怪的铸造错误!),
size\u t
。。。以及
typedef PyObject*Py让事情变得非常棘手。

非常感谢!您为我节省了很多时间)@errfrom You's welcome:)我在运行您的脚本时实际上遇到了一个分段错误,因此使用gdb进行调试非常容易。