【问题标题】:std::vector<> datatype python wrapper in ctypesctypes 中的 std::vector<> 数据类型 python 包装器
【发布时间】:2022-10-25 15:24:03
【问题描述】:

如何在 ctypes 库中为矢量数据类型编写 python 包装器?我在 ctypes 文档中找不到任何参考。下面是我需要编写 python 包装器的情况,

头文件

struct ClassItem {
    int rollNumber = 0;
    float score = 0;
};

struct ClassData {
    std::vector<ClassItem> v_classItem;
};

//API
int show_class(ClassData *p_class_data, uint8_t max_number);

蟒蛇包装

class ClassData (Structure):
_fiels_ = [
(v_classItem , ??) #datatype declaration
]

【问题讨论】:

  • 你需要v_classItem成为一个std::vector<类项>?或者它可能是一个指针?
  • @CristiFati,我更喜欢v_classItem在向量中。如果没有,那么将尝试指针。如果我得到两个实现将很有用,我可以做实际的代码实现和检查。
  • 如果您需要矢量和可从以下位置访问的内部对象Python,那么也许类型不是最好的选择。你可以试试PyBind11.有一些方法可以解决这个问题,但它们只是解决方法。
  • @CristiFati,目前我所有的包装器都在 ctypes 中,如果我只为这个 API 尝试 pybind11。它可以与 ctypes 包装器一起使用吗?正如你所说的那样用指针实现它?因为我没有访问 python 中向量的任何内部对象。我只需要通过这个向量结构体作为参数表演课上面提到的 API。

标签: c++ python-3.x ctypes


【解决方案1】:

我尝试在 ctypes 中使用 pointer 为 vector ,它对我有用。我可以访问ClassItem 结构中的两个变量。

Python 数据类型

class ClassItem {
    ('rollNumber', ctdt.c_int),
    ('score', ctdt.c_float)
};

class ClassData (Structure):
_fiels_ = [
(v_classItem , ctdt.POINTER(ClassItem)) #datatype declaration
]

访问数据

data_obj = ClassData()
print('****************')
print('RECEIVED DATA')
for i in range(0,5): # Since it is a pointer, range should be known and hardcoded
    print('[PYTHON APP]INDEX:', data_obj.v_classItem[i].rollNumber, 
        'SCORE:', data_obj.v_classItem[i].score)
print('****************')

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多