使用python ctypes通过引用c ++函数传递长向量

时间:2019-01-19 11:29:06

标签: c++11 vector pass-by-reference ctypes long-integer

Am通过使用ctypes引用c ++函数作为python的参数来尝试传递long类型的空向量。

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

test.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返回一个动态分配的数组。

1 个答案:

答案 0 :(得分:0)

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

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

test.cpp

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