- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试转换由在 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::list
的 std::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_caster在 load
方法
CastToSheetData
函数中的代码
关于python - pybind11:Python 到 C++ 数据类型的转换不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55210375/
首先,感谢大家努力解决我的这个疑问。我正在转换一个最小的 C++ 项目以在 Python 中使用。这种努力背后的真正原因是为了速度。 我遇到了 PyBind,对它的功能以及他们提供的文档数量感到非常惊
我有以下类结构(我实际实现的简化示例): /* TestClass.hpp */ #pragma once template class CurRecTemplate { protected:
我有以下设置(1 个基类、1 个派生类、1 个容器)。容器采用 shared_ptr作为输入。 #include namespace py = pybind11; struct Base { };
我刚刚安装了 pybinding,我正在尝试运行该库文档中提出的第一个示例。 import pybinding as pb import numpy as np import matplotlib.p
我正在使用 pybind 包装一些 C++ 函数,然后在 Python 中使用它。我需要一些结构,但我不知道如何在 Python 中访问它的属性。我的结构没有只有方法的属性,所以我认为绑定(bind)
我使用以下命令创建了一个 miniconda 环境: conda create -n build_a_python_cpp_module xtensor-python -c conda-forge 激
为了更好地理解如何使用 pybind 库将参数从 Python 传递到 C++ 函数,我想构建一个小的虚拟/演示代码,我可以在其中接收 C++ 端的 Python 列表,将其转换为浮点指针对象,然后打
我正在尝试编译 Pybind11 C++ 中的模块它调用了几个头文件(.h)在上面。由于我有很多头文件,我决定做一个 Makefile ,没有问题,除了创建目标共享对象文件(s.o) .我需要这个共享
pybind 的新手 - 阅读文档,但我不了解如何将其应用于二维数组。 我有两个数组存储 3d 坐标 shape = (10,3) a = np.zeros(shape=(10,3)) b = np.
TL;博士 将 pybind11 绑定(bind)添加到工作中的 C++ DLL 项目允许我在 Python 中导入和使用生成的 DLL,但会破坏我使用 boost/dll 机制在 C++ 代码中使用
在 Pybind 中,可以通知 Python 关于函数的参数名称: m.def("add", &add, "A function which adds two numbers", py::arg(
当我运行 pip install .在我有 setup.py 的目录中。我正在使用 pybind11 为我的 C++ 项目构建一个 python 模块。 (同样,在 Windows 10 上) 我收到
我正在尝试使用 PyBind 在 C++ 中嵌入一些 Python 代码。大多数文档都是关于使用 C++ 扩展 Python,但我对嵌入感兴趣: 关于 http://pybind11.readthed
我正在尝试使用 pybind11 实现 C++ 到 python,并使用 pybind11-multiprocessing-hangs 。不同之处在于我想在c++中使用python对象并继续从c++调
我是一名优秀的程序员,十分优秀!