使用 Python CTYPES 通过引用 C++ 函数传递长向量

using python ctypes pass a long vector by reference to a c++ function

提问人:4am 提问时间:1/19/2019 更新时间:1/21/2019 访问量:593

问:

我试图通过引用 c++ 函数将 long 类型的空向量作为使用 ctypes 从 python 传递参数。

我使用 python3 和 c++11 编译器。 我尝试传递ctypes.c_void_p指针,但它给出了错误的结果。

测试 .cpp

extern "C" {
 int pke_decrypt(char *a,char *b,vector<long> &v)
  {do something;
   assign v;
   }}

test.py

_p=ctypes.CDLL('/home/electrical/Downloads/src/libpke.so')
 _p.pke_decrypt.argtypes = [ctypes.c_char_p,ctypes.c_char_p,ctypes.POINTER(ctypes.c_void_p))]
 def decrypt(input1,input2):
    global _p   
    v=ctypes.c_void_p()
    print (v)
    result=_p.pke_decrypt(input1.encode('utf-8'),input2.encode('utf-8'),ctypes.byref(v))
    print (v)
    return

我希望得到一个随机大小的数组(在 c++ 函数中计算)作为输出。也就是说,结果向量的大小不是预定义的,否则我可以使用 numpy.ndpointers() 并定义一个返回类型并从 c 返回一个动态分配的数组。

C++11 向量 按引用传递 ctypes 长整型

评论

1赞 CristiFati 1/20/2019
请注意,它是 c 类型,而不是 c++ 类型
0赞 4am 10/20/2020
好吧,它也适用于 C++
0赞 CristiFati 10/20/2020
根据你的回答,它没有OOTB。您必须执行其他步骤(在 test.cpp 中将其转换为 C 类型)。

答:

0赞 4am 1/21/2019 #1

我通过引用 c++ 传递了 char*,它起作用了:

test.py

_pqc=ctypes.CDLL('/home/electrical/Downloads/src/libpke.so')
_pqc.pke_decrypt.argtypes = [ctypes.c_char_p,ctypes.c_char_p,ctypes.POINTER(ctypes.c_char_p)]
 def pke_decrypt(input1,input2):
     global _p
     v=ctypes.c_char_p()    
     result=_pqc.pke_decrypt(input1.encode('utf-8'),input2.encode('utf-8'),ctypes.byref(v))
     print((v.value).decode("utf-8"))
     return

测试 .cpp

int pke_decrypt(char *input1,char *input2,char* &vout){
   Internal conversion from char* to vector<long> 
}