如何通过 ctypes 将(非空)列表从 Python 传递到 C++?

Posted

技术标签:

【中文标题】如何通过 ctypes 将(非空)列表从 Python 传递到 C++?【英文标题】:How to pass (non-empty) list of lists from Python to C++ via ctypes? 【发布时间】:2018-08-01 12:33:39 【问题描述】:

我有一些格式的数据:

data = [[1,1,1],[2,2,2],[3,3,3]]

如何通过 ctypes 将其传递给 C++?

我可以像这样单独传递每个列表:

import ctypes

temp1 = [1,1,1]
temp2 = [2,2,2]
temp3 = [3,3,3]

list1 = (ctypes.c_int * 3)(*temp1)     #NO IDEA WHAT THE * MEANS
list2 = (ctypes.c_int * 3)(*temp2)
list3 = (ctypes.c_int * 3)(*temp3)

但在那之后,如果我尝试将所有这些列表附加到“数据”中......

data.append(list1)
data.append(list2)
data.append(list3)

data_final = (ctypes.?????? * 3)(*data)

我应该放入什么类型的?????谢谢

【问题讨论】:

*表示解包,所以list1 = (ctypes.c_int * 3)(*temp1) 扩展为list1 = (ctypes.c_int * 3)(1, 1, 1) 【参考方案1】:

?????? 应该是ctypes.c_int * 3 * 3

data_final = (ctypes.c_int * 3 * 3)(*data)
[list(a) for a in data_final]
# --> [[1, 1, 1], [2, 2, 2], [3, 3, 3]]

为了记录,不要这样做

data = []
data.append(list1)
data.append(list2)
data.append(list3)

这是python,不是c++,做

data = [list1, list2, list3]

因为你只是要把它传递给一个函数 do

data_final = (ctypes.c_int * 3 * 3)(list1, list2, list3)

并完全跳过data 步骤


只是为了最 Pythonic 的方式,如果我在 N x M 列表列表 py_list 中有数据,我会这样做

c_array = (c_types.c_int * M * N)(*[(c_types.c_int * M)(*lst) for lst in py_list])

【讨论】:

谢谢!我会试试这个。另外,当将它作为参数传递给 C++ 时,我应该怎么做? py_function.argtypes = [ctypes.ARRAY] 或者 ctypes 中这个结构的确切类型是什么?非常感谢 FHTMitchell 类型是ctypes.c_int * 3 * 3,你可以使用它。您可以将其保存为c_long_Array_3_Array_3 或其他名称(这就是它的内部名称)。

以上是关于如何通过 ctypes 将(非空)列表从 Python 传递到 C++?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ctypes 将 Python 列表转换为 C 数组?

使用 numpy/ctypes 公开 C 分配的内存缓冲区的更安全方法?

如何使用 ctypes 将数组从 C++ 函数返回到 Python

Python ctypes:如何将 ctypes 数组传递给 DLL?

将 FILE * 从 Python / ctypes 传递给函数

Pyspark:如何将现有非空列的元组列表作为数据框中的列值之一返回