我正在使用 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)
Output:
[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 小时,但我不知道解决方案是什么(可能是一些愚蠢的东西)
提前致谢!
设置dtype
到Pythonint
将使用 Clong
。如果您使用的是 64 位平台(Windows 除外),则这是 64 位数据类型,这解释了交错的 0。您可以通过设置来检查这一点dtype=np.int32
vs dtype=np.int64
.
第二,check.ctypes.data
是一个Pythonint
代表一个Cvoid *
指针。将其传递为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"
。否则导出的名称将被破坏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)