我正在玩ctypes ...我有以下C代码
编辑:我试图弄清楚这一点的原因是为了使这篇博文更正确
sumrange.c
#include <stdio.h>
long sumrange(long);
long sumrange(long arg)
{
long i, x;
x = 0L;
for (i = 0L; i < arg; i++) {
x = x + i;
}
return x;
}
Run Code Online (Sandbox Code Playgroud)
我使用以下命令编译(在OSX上)
$ gcc -shared -Wl,-install_name,sumrange.so -o ./sumrange.so -fPIC ./sumrange.c
Run Code Online (Sandbox Code Playgroud)
我在python中实现了相同的功能:
pysumrange = lambda arg: sum(xrange(arg))
Run Code Online (Sandbox Code Playgroud)
然后我在交互式shell上运行:
>>> import ctypes
>>> sumrange = ctypes.CDLL('./sumrange.so')
>>> pysumrange = lambda arg: sum(xrange(arg))
>>> print sumrange.sumrange(10**8), pysumrange(10**8)
... 887459712 4999999950000000
Run Code Online (Sandbox Code Playgroud)
......而且数字不匹配.为什么会这样?
我尝试使用unsigned long longC代码中的所有变量而没有效果(相同的输出).
long 是一个32位类型,所以C代码只是溢出.
Python没有; pysumrange给你正确的答案.
ctypesunsigned long long除非你告诉它,否则不知道函数的返回类型.请参阅Python标准库文档中的返回类型.它说:
默认情况下,假定函数返回C
int类型.可以通过设置restype函数对象的属性来指定其他返回类型.
所以,在调用函数之前,这样做可能会对你有用:
sumrange.sumrange.restype = ctypes.c_ulonglong
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
735 次 |
| 最近记录: |