gpt4 book ai didi

python - pybind11:Python 到 C++ 数据类型的转换不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 12:38:55 27 4
gpt4 key购买 nike

问题

我正在尝试转换由在 C++ 代码中调用的 python 函数返回的列表列表。虽然 pybind11 库允许从 python 数据类型到 C++ 数据类型的类型转换,但我尝试将 python 返回的列表列表转换为 std::list >std::list C++ 字符串,每次都失败。

代码

这是 python 函数(该函数返回包含字符串值的列表列表):

def return_sheet(self):

"""Returns the sheet in a list of lists

"""

dataTable = []

for r in range(self._isheet.nrows):

datalist = []

for c in range(self._isheet.ncols):

datalist.append(self._isheet.cell_value(r,c))

dataTable.append(datalist)

return dataTable

在这里,我使用 pybind11 在 C++ 中调用它:

py::list obj = _tool.attr("return_sheet")();

data = py::cast<SheetData>(obj); // This is where the problem lies, This cast crashes the program

其中 SheetData 是一个 typedef 用于:

typedef std::list<std::list<std::string> > SheetData;

在调试的过程中,我发现程序实际上是在这一行崩溃了:

py::object dataTable = _tool.attr("return_sheet")(); // Where _tool.attr("return_sheet")() gives an py::object which is a list of list of str

有人知道,我怎样才能成功地将 python 列表的列表转换为 C++ 的 std::liststd::list

编辑

这是我嵌入到 C++ [xlanalyser.py] 中的 python 程序文件:https://pastebin.com/gARnkMTv

这是 C++ 代码 [main.cpp]:https://pastebin.com/wDDUB1s4

注意:xlanalyser.py 中的所有其他函数在嵌入到 c++ 时不会导致崩溃 [只有 return_sheet() 函数导致崩溃]

最佳答案

您可以使用 Python/C API 作为解决方法(检查函数 CastToSheetData)。我在下面包含了完整的示例:

程序.py

def return_matrix():

dataTable = []
for r in range(0,2):
datalist = []

for c in range(0,2):
datalist.append(str(r+c))

dataTable.append(datalist)
return dataTable

主要.cpp

#include <pybind11/embed.h>
#include <iostream>
#include <list>
#include <string>

typedef std::list<std::list<std::string> > SheetData;

namespace py = pybind11;

SheetData CastToSheetData(PyObject *obj)
{
SheetData data;
PyObject *iter = PyObject_GetIter(obj);

if (!iter)
return data;
while (true) {
std::list<std::string> aux_list;
PyObject *next = PyIter_Next(iter);
if (!next) {
// nothing left in the iterator
break;
}
PyObject *iter2 = PyObject_GetIter(next);
if (!iter2)
continue;
while(true) {
PyObject *next2 = PyIter_Next(iter2);
if (!next2) {
// nothing left in the iterator
break;
}
PyObject* pyStrObj = PyUnicode_AsUTF8String(next2);
char* zStr = PyBytes_AsString(pyStrObj);
std::string foo(strdup(zStr));
aux_list.push_back(foo);
Py_DECREF(pyStrObj);
}
data.push_back(aux_list);
}

return data;
}


int main()
{
py::scoped_interpreter guard{};
py::module calc = py::module::import("program");
py::object result = calc.attr("return_matrix")();

SheetData data = CastToSheetData(result.ptr());

for (auto l : data)
{
std::cout << "[ ";
for(auto s : l)
std::cout << s << " ";
std::cout << "]" << std::endl;
}

return 0;
}

输出:

[ 0 1 ]
[ 1 2 ]

可能,最好的方法是自定义 type_casterload 方法

中使用 CastToSheetData 函数中的代码

关于python - pybind11:Python 到 C++ 数据类型的转换不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55210375/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com