gpt4 book ai didi

c++ - 通过 Boost.Python 将 C 风格的数组数据成员暴露给 Python

转载 作者:太空狗 更新时间:2023-10-29 20:47:49 24 4
gpt4 key购买 nike

我有一个包含 C 风格数组数据成员的 struct。我想让这个结构暴露给 Python,并且这个数据成员可以作为 Python 中的列表访问。

struct S
{
char arr[4128];
};

void foo( S const * )
{}

BOOST_PYTHON_MODULE( test )
{
using namespace boost::python;

class_<S>( "S" )
.def_readwrite( "arr", &S::arr )
;

def( "foo", foo );
}

上面的代码构建失败

error C2440: '=' : cannot convert from 'const char [4128]' to 'char [4128]'

C 风格的数组不可赋值,所以这个错误是有道理的。如果我将数据成员更改为普通 char 而不是数组,代码就会编译。

我无法用 std::array 或其他容器替换数组,因为该结构正被 C API 使用。我能想到的唯一解决方案是编写几个包装器并执行以下操作

  1. 一个 struct S1 复制 S 除了它有一个 std::array 而不是 C 风格的数组
  2. foo_wrapper 接受 S1 const *,将内容复制到 S 实例并调用 foo
  3. 注册一个 to_python_converterstd::array 转换为 Python 列表

这应该可行,此时我不太关心数据复制,但如果我可以避免它并直接公开数组而不必跳过所有这些环节,那就太好了。

所以问题是,我怎样才能将 C 风格的数组数据成员作为列表公开给 Python?

最佳答案

如您所见,不幸的是,Boost.Python 没有为 C 数组提供自动转换器,甚至它提供的 STL 容器包装器也不是我推荐的方法(至少如果您的实际问题与此类似根据数组的大小以及您是否知道要将其作为真正的 Python 元组公开)。

我建议编写一个将 C 数组转换为 Python 元组的函数,直接使用 Python C-API 或其 boost::python 包装器,然后通过属性公开数据成员。虽然您可以通过使用 NumPy 数组而不是元组来避免数据复制,但对于不值得付出努力的小型数组。

例如:

namespace bp = boost::python;

bp::tuple wrap_arr(S const * s) {
bp::list a;
for (int i = 0; i < 10; ++i) {
a.append(s->arr[i]);
}
return bp::tuple(a);
}

BOOST_PYTHON_MODULE( test ) {
bp::class_<S>( "S" )
.add_property("arr", wrap_arr)
;
}

关于c++ - 通过 Boost.Python 将 C 风格的数组数据成员暴露给 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17885639/

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