在 python swig 中读取 c++ 2d 数组

Posted

技术标签:

【中文标题】在 python swig 中读取 c++ 2d 数组【英文标题】:Reading c++ 2d array in python swig 【发布时间】:2017-06-07 23:26:18 【问题描述】:

C++部分 我有一个类a 和一个public 变量2d int 数组b,我想用python 打印出来。(我想访问它的方式是a.b

我已经能够封装大部分代码,现在我可以在python中调用a类中的大部分函数了。

那么如何在 python 中读取 b 呢?如何使用 numpy.i 将其读入 numpy 数组(我找到了一些关于如何使用非变量函数的解决方案)?有没有办法可以读取 c++ 库中的任何数组?或者我必须处理接口文件中的每个变量。

当我尝试在 python 中使用 b 时,现在 b 是 <Swig Object of type 'int (*)[24]' at 0x02F65158>

ps: 1.如果可能我不想修改cpp部分。

    我试图访问一个变量,而不是一个函数。

所以不要向我推荐不能真正回答我问题的链接,谢谢。

【问题讨论】:

【参考方案1】:

如果您使用一维数组来访问元素,您会发现在语言之间来回传递东西会容易得多,例如arr[y*WIDTH+x].

由于您使用 C++ 进行操作,您甚至可以将这些数组包装在具有良好 operator()(int x, int y) 方法的类中,以便在 C++ 端使用。

事实上,这是 Numpy 用于数组的内部表示:它们都是一维的。

【讨论】:

【参考方案2】:

如果您可以添加 C++ 定义的代码 sn-p(或者如果您使用 int**,则添加 C),您的问题会更容易回答。当您说“2d int array”时,您的意思是一般的 int ** 吗?数组大小是否提前知道?

无论如何,您都可以使用numpy.i,但这取决于您的阵列的详细信息。

看到这个有点相关的问题: Swig and multidimensional arrays

【讨论】:

是的,它是一个通用的 int**,它有 2 种可能的大小。我已经知道如何通过在 c++ 定义中添加代码 sn-p 来使其工作。但我仍在寻找一种方法,仅通过编辑接口文件或 python 部分来使其工作。谢谢!

以上是关于在 python swig 中读取 c++ 2d 数组的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 SWIG 在 Python 中实例化 C++ 类(获取属性错误)

在 SWIG 中携带自定义 Python 数据的 C++ 对象

Swig:在 Python 中使用 c++ STL 复杂

动态链接和 Python SWIG (C++) 在 C++ 中工作在 python 中失败

SWIG:将异常从 Python 抛出到 C++

使用 SWIG 在 Python 中访问 C++ typedef