我正在使用ctypes,我正在将一个ndarray传递给一个c函数。 它给了我奇怪的输出行为。 下面是一些代码:
C-功能:
int foo(int * foo,int N){
for(int i=0;i<N;i++){
cout << "i " << i << " "<< foo[i] << endl;
}
return 0;
}
的Python:
from ctypes import *
import numpy as np
bar = cdll.LoadLibrary(".../libtest.so")
N = c_int(10)
check = np.ones(10, dtype=int)
print check
bar.foo(c_int(check.ctypes.data),N)
输出:
[1 1 1 1 1 1 1 1 1 1]
i:0 out:1
i:1 out:0
i:2 out:1
i:3 out:0
i:4 out:1
i:5 out:0
i:6 out:1
i:7 out:0
i:8 out:1
i:9 out:0
应该一切正确吗? :)
我用
进行编译g++ -g -c -fPIC -O0 pythagoras.cpp
g++ -shared -Wl,-soname=libtest.so -o libtest.so pythagoras.o
任何想法?我现在正在寻找失败至少1小时,我不知道解决方案是什么(可能是一些愚蠢的事情)
提前致谢!
答案 0 :(得分:3)
将dtype
设置为Python int
将使用C long
。如果您使用的是64位平台(Windows除外),那么这是一种64位数据类型,它解释了交错的0。您可以通过设置dtype=np.int32
vs dtype=np.int64
来确认这一点。
其次,check.ctypes.data
是表示C int
指针的Python void *
。将其作为c_int
传递是不正确的。至少使用c_void_p
,并定义argtypes
:
from ctypes import *
import numpy as np
bar = CDLL('.../libtest.so')
bar.foo.argtypes = [c_void_p, c_int]
check.ctypes
定义_as_parameter_
ctypes钩子,它返回c_void_p
的实例:
N = 10
check = np.ones(N, dtype=np.int32)
print check
bar.foo(check.ctypes, N)
您可以使用check.ctypes.data_as
更具体,或者使用np.ctypeslib.ndpointer
定义类型。
顺便说一下,foo
是C ++函数,而不是C.你必须使用extern "C"
。否则导出的名称将被破坏。