Python/C API-结果不显示
我想在Python中集成C模块,因此我选择了接口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.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
returnslong
,因此也可能会出现奇怪的铸造错误!),size\u t
。。。以及typedef PyObject*Py对于经常编写C扩展的人来说,代码>让事情变得非常棘手。非常感谢!您为我节省了很多时间)@errfrom You's welcome:)我在运行您的脚本时实际上遇到了一个分段错误,因此使用gdb进行调试非常容易。