【发布时间】:2016-03-18 11:43:51
【问题描述】:
我正在尝试将一个空的 result 列表传递给一个 C 函数,该函数可以在 Python 中进行修改和使用。这是我想要做的:
filename = askopenfilename()
result = []
status = self.lib.Cal_readFile(filename, result)
filename 参数很好,但是传递结果变量我得到错误:
status = self.lib.Cal_readFile(filename, result)
ctypes.ArgumentError: argument 2: <class 'TypeError'>: Don't know how to convert parameter 2
我对 ctypes 文档所述的错误并不感到惊讶:
如前所述,除整数之外的所有 Python 类型, 字符串和 unicode 字符串必须包装在它们对应的 ctypes 类型,以便将它们转换为所需的 C 数据 输入
有没有办法解决这个问题?我看不到列表的 ctype。
我本质上想要一个 C 函数在调用时会为我修改的列表。它的工作方式类似于如果我通过引用传递 C 函数中的值并对其进行修改,它将修改原始值。
【问题讨论】:
-
C 没有“列表”类型。您可能必须编写自己的 C 列表库。
-
@franklin 在 C 中我将使用
result变量作为PyObject。我在 C 中的包装函数中使用python.h。 -
您是否同时开发 C 库和加载它的 Python 代码?如果是这样,用 C 编写 Python 模块可能会更容易。在教程中,您还将找到如何传递任何 Python 对象并在 C 代码中操作它们的提示。然后,您还可以编写返回元组的代码,例如
status, result = plugin.read_file(filename)或抛出异常而不是返回错误代码。 -
@UlrichEckhardt 是的,看起来这就是我想要的。我在这里提出了一个新问题:stackoverflow.com/questions/36091759/…
标签: python c ctypes python-3.5