【问题标题】:using python ctypes pass a long vector by reference to a c++ function使用 python ctypes 通过引用 c++ 函数传递一个长向量
【发布时间】:2019-06-13 11:08:34
【问题描述】:

我试图通过引用一个 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() 并定义一个返回类型并从 c 返回一个动态分配的数组。

【问题讨论】:

  • 请注意,它是 c 类型而不是 c++ 类型。
  • 它也适用于 c++
  • 根据您的回答,它没有OOTB。您必须做一个额外的步骤(在 test.cpp 中将其转换为 C 类型)。

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


【解决方案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

test.cpp

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多