【问题标题】:How to Pass Two-dimensional array from C to Python如何将二维数组从 C 传递到 Python
【发布时间】:2015-05-19 15:45:42
【问题描述】:

我想将二维数组从C传递给python。

如何使用Py_BuildValue()PyEval_CallObject()

例如,我可以使用以下代码将字符串从 C 传递给 python:

pModule = PyImport_ImportModule("python_code");
pFunc = PyObject_GetAttrString(pModule, "main");
pParam = Py_BuildValue("(s)", "HEHEHE");
pResult = PyEval_CallObject(pFunc,pParam);

现在,我想将二维数组和一个字符串传递给 python

【问题讨论】:

  • 您是否使用 return 列表或更改列表参数?如果您不知道,那么返回会更容易。
  • 您可能还希望考虑标准库中的 ctypes。
  • 你能告诉我们你想要传递给python的代码和示例数据吗?
  • 我只是想将“vector> arr”传递给python函数,在python中可以是元组或列表

标签: python c++ c


【解决方案1】:

所以基本上,你想构建一个元组,而不是解析一个。

这只是一个简单的示例,说明如何将 arr 转换为元组的元组。在这里,您还应该在某个时间点添加一些错误检查。

Py_ssize_t len = arr.size();
PyObject *result = PyTuple_New(len);
for (Py_ssize_t i = 0; i < len; i++) {
    Py_ssize_t len = arr[i].size();
    PyObject *item = PyTuple_New(len);
    for (Py_ssize_t j = 0; j < len; j++)
        PyTuple_SET_ITEM(item, j, PyInt_FromLong(arr[i][j]));
    PyTuple_SET_ITEM(result, i, item);
}

(对于 Python 3 C API,将 PyInt_FromLong(arr[i][j]) 替换为 PyLong_FromLong(arr[i][j])

然后你可以构建你的参数,就像你对字符串所做的那样。你可以使用O 代替s 代替字符串,而使用PyObject *(或者N,如果你不想增加引用计数):

pParam = Py_BuildValue("(O)", result);

也许boost::python 可以提供一个更简单的方法,但我自己并不真正了解这个库。

【讨论】:

  • 谢谢 tynn,然后如何在构建元组后将值发送到 python scripty。例如,我使用此代码发送字符串: pParam = Py_BuildValue("(s)", "HEHEHE"); pResult = PyEval_CallObject(pFunc,pParam);
  • 谢谢你,这对我有帮助
【解决方案2】:

第二个循环需要从以下位置进行细微更改:

for (Py_ssize_t j = 0; i &lt; len; j++)

for (Py_ssize_t j = 0; j &lt; len; j++)

使用正确的运行条件语句。

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多