使用 python ctypes 通过引用 c++ 函数传递长向量
using python ctypes pass a long vector by reference to a c++ function
我正在尝试通过引用 c++ 函数作为参数从 python 使用 ctypes 传递一个 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
我希望得到一个 long 类型的随机大小数组(在 c++ 函数中计算)作为输出。也就是说,结果向量的大小不是预定义的,否则我可以使用 numpy.ndpointers() 并定义一个 return 类型,然后 return 从 c 中编辑一个动态分配的数组。
我通过引用 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
test.cpp
int pke_decrypt(char *input1,char *input2,char* &vout){
Internal conversion from char* to vector<long>
}
我正在尝试通过引用 c++ 函数作为参数从 python 使用 ctypes 传递一个 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
我希望得到一个 long 类型的随机大小数组(在 c++ 函数中计算)作为输出。也就是说,结果向量的大小不是预定义的,否则我可以使用 numpy.ndpointers() 并定义一个 return 类型,然后 return 从 c 中编辑一个动态分配的数组。
我通过引用 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
test.cpp
int pke_decrypt(char *input1,char *input2,char* &vout){
Internal conversion from char* to vector<long>
}