当使用ctypes调用C库时,Python无法正确打印长整数

当使用ctypes调用C库时,Python无法正确打印长整数,python,c,ctypes,long-integer,Python,C,Ctypes,Long Integer,我想做一些Python多线程处理,并使用ctypes绕过GIL 我写了一些C代码test.C: long long sum_range(long high) { long i; long long s = 0LL; for (i = 0L; i < high; i++) s += (long long)i; return s; } 从Python 3脚本调用它: import ctypes import os testlib = ctypes.cdll

我想做一些Python多线程处理,并使用ctypes绕过GIL

我写了一些C代码test.C:

long long sum_range(long high)
{
  long i;
  long long s = 0LL;
 
  for (i = 0L; i < high; i++)
      s += (long long)i;

  return s;
}
从Python 3脚本调用它:

import ctypes
import os

testlib = ctypes.cdll.LoadLibrary(os.getcwd()+"/libtest.so")

sum_range = testlib.sum_range
sum_range.argtypes = [ctypes.c_long]
sum_range.restypes = ctypes.c_longlong

iterations=100000

print("sum_range(iterations) = {}".format(sum_range(iterations)))
这给

总和范围(迭代)=704982704

而不是4999950000。 这里怎么了

PS在C代码中添加一个
printf
,表明Python脚本返回了正确的值4999950000

PPS当
迭代次数
小十倍,即10000次时,打印正确的值


购买力平价A较早提出,但设置重新类型显然无法解决问题。

应该是
sum\u range.restype
而不是
sum\u range.restypes
?我对ctypes一点也不熟悉,但您链接到的答案使用的是
restype
,而不是
restypes
。就是这样!谢谢它应该是restype(单数),argtypes是复数。对我来说没有完全意义,因为C库可以返回多个值。同样奇怪的是,在使用restypes(复数)时不会出现错误。C或Python中的函数只能返回一个值。这可能是C中的结构或Python中的元组/列表,但它仍然是一个值。未引发任何错误,因为
sum\u range
对象可能具有允许您设置任意属性的
\u dict\u
(这是python类型的默认设置)。在的副本上搜索“\uuuu dict\uuuuuu”。
import ctypes
import os

testlib = ctypes.cdll.LoadLibrary(os.getcwd()+"/libtest.so")

sum_range = testlib.sum_range
sum_range.argtypes = [ctypes.c_long]
sum_range.restypes = ctypes.c_longlong

iterations=100000

print("sum_range(iterations) = {}".format(sum_range(iterations)))