gpt4 book ai didi

python ctypes - 传递 numpy 数组 - 奇数输出

转载 作者:太空狗 更新时间:2023-10-30 01:22:50 24 4
gpt4 key购买 nike

我正在使用 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 小时,但我不知道解决方案是什么(可能是一些愚蠢的东西)

提前致谢!

最佳答案

dtype 设置为 Python int 将使用 C long。如果您使用的是 64 位平台(Windows 除外),则这是 64 位数据类型,这解释了交错的 0。您可以通过设置 dtype=np.int32dtype=np.int64 进行检查。

其次,check.ctypes.data 是一个 Python int 表示一个 C 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 钩子(Hook),它返回一个 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"。否则导出的名称将被破坏。

关于python ctypes - 传递 numpy 数组 - 奇数输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18791793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com