【问题标题】:SWIG, py + C: no attribute under pointerSWIG,py + C:指针下没有属性
【发布时间】:2012-01-28 11:04:24
【问题描述】:

我对 SWIG (C + python) 有一个奇怪的问题

在 C 中,我有一个函数返回指向结构 elements_t 的指针。我在 python 中调用函数,得到结果(指针),但我无法访问结构的元素..

typedef struct elements elements_t;
struct elements {
    int nelements;
    // ... other stuff
};

elements_t* get_elements()
{
    elements_t* p;
    // ...
    return p;
}

在 python 中我会这样做:

r = clibrary.get_elements()
print r
# <Swig Object of type 'elements_t *' at 0xb77029f8>
print r.nelements
# AttributeError: 'SwigPyObject' object has no attribute 'nelements'

所以我得到最后一个错误,即没有 nelements,即使 p 指向正确的结构......

【问题讨论】:

  • 是的,问题中有错误。代码仍然不起作用:(
  • 好的,既然 r 是一个指向结构体的指针,是否可以只返回结构体?我正在查看swig.org/Doc1.3/Python.html 的“31.3.6 结构”部分,其中有一些示例。

标签: python c swig


【解决方案1】:

根据 SWIG for Python 文档的 pointers 部分:

唯一不能做的就是从 Python 中取消引用指针。

您需要取消引用该指针才能访问其成员。您需要在 C 中编写访问器/修改器函数来操作结构成员。

【讨论】:

  • 如果可以避免的话,或者只返回结构的一个实例而不是指向它的指针..
  • 真正的原因是“结构元素”的接口文件中缺少声明。所以 swig 没有为结构生成代理类。添加声明后,您将看到:print r #proxy of 然后您可以访问 r.nelements
  • @bestwolf1983 你的意思是在接口文件中附加struct elements; 吗?我刚试过。它不起作用。可能我理解错了。
【解决方案2】:

它并不漂亮,但您始终可以编写访问器函数来使用指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    相关资源
    最近更新 更多