использование Python ctypes передать длинный вектор по ссылке на функцию C ++ - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь передать пустой вектор типа long по ссылке на функцию c ++ в качестве аргумента от python с использованием ctypes.

Я использую компилятор 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

I'mamожидая получить массив произвольного размера (который вычисляется в функции c ++) типа long в качестве вывода.То есть размер результирующего вектора не предопределен, иначе я мог бы использовать numpy.ndpointers () и определить тип возвращаемого значения и вернуть динамически распределенный массив из c.

1 Ответ

0 голосов
/ 21 января 2019

Я передал 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> 
}
...