SWIG/python 数组内部结构
我在 header.h 中定义了一个结构,如下所示:
typedef struct {
....
int icntl[40];
double cntl[15];
int *irn, *jcn;
....
当我使用此结构初始化一个对象时,我可以访问整数/双精度数,但不能访问数组。
>> st.icntl
<Swig Object of type 'int *' at 0x103ce37e0>
>> st.icntl[0]
Traceback (most recent call last):
File "test_mumps.py", line 19, in <module>
print s.icntl[0]
TypeError: 'SwigPyObject' object is not subscriptable
如何访问读/写中的值?
I've got a structure defined inside header.h that looks like :
typedef struct {
....
int icntl[40];
double cntl[15];
int *irn, *jcn;
....
When I init an object with this structure, I have access to integers/doubles but not arrays.
>> st.icntl
<Swig Object of type 'int *' at 0x103ce37e0>
>> st.icntl[0]
Traceback (most recent call last):
File "test_mumps.py", line 19, in <module>
print s.icntl[0]
TypeError: 'SwigPyObject' object is not subscriptable
How to have access to the values in read/write?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
最简单的方法是将数组包装在
struct
中,然后它可以提供 满足“可订阅”要求的额外方法。我整理了一个小例子。它假设您使用的是 C++,但由此构建等效的 C 版本相当简单,只需要一些重复。
首先,C++ 标头包含我们想要包装的 struct 和用于包装固定大小数组的模板:
我们相应的 SWIG 接口看起来像这样
:使用
%extend
提供__getitem__
这是Python用于下标读取的方法,
__setitem__
< /a> 用于写入。 (我们还可以提供一个 __iter__ 来使类型可迭代)。我们还给出了我们想要使用唯一名称的特定wrapped_array
,以使 SWIG 将它们包装在输出中。使用提供的接口,我们现在可以执行以下操作:
您可能还会发现这种方法 作为替代方案有用/有趣。
The easiest way to do this is to wrap your arrays inside a
struct
, which can then provide extra methods to meet the "subscriptable" requirements.I've put together a small example. It assumes you're using C++, but the equivalent C version is fairly trivial to construct from this, it just requires a bit of repetition.
First up, the C++ header that has the
struct
we want to wrap and a template that we use for wrapping fixed size arrays:Our corresponding SWIG interface then looks something like:
The trick there is that we've used
%extend
to supply__getitem__
which is what Python uses for subscript reads and__setitem__
for the writes. (We could also have supplied a__iter__
to make the type iteratable). We also gave the specificwraped_array
s we want to use unique names to make SWIG wrap them in the output.With the supplied interface we can now do:
You might also find this approach useful/interesting as an alternative.
我会用 python 来做这个
I would have done this in python
您是否考虑过使用 SWIG 载体?
在你的头文件中:
然后,在你的 swig 文件中:
Python 看起来像这样:
你仍然不能直接设置结构。我编写 python 包装器代码来隐藏样板文件。
array_class 仅适用于基本类型(int、double),如果您需要其他类型(例如 uint8_t),您需要使用 array_functions,它有更多的样板文件,但它们可以工作。
http://www.swig.org/Doc3.0/SWIGDocumentation.html#库_cararrays
Have you considered using SWIG carrays?
In your header file:
Then, in your swig file:
The Python looks like this:
You still can't set the structs directly. I write python wrapper code to hide the boilerplate.
array_class only works with basic types (int, double), if you need something else (e.g. uint8_t) you need to use array_functions, which have even more boilerplate, but they work.
http://www.swig.org/Doc3.0/SWIGDocumentation.html#Library_carrays