SWIG生成无效的Python包装器代码

时间:2014-12-04 22:21:37

标签: python swig

当我使用SWIG生成Python包装器时,有时会出现这个问题。它适用于Swig 2.x和3.x版本。我不知道触发它的原因,但有时在代码重构之后会出现此错误。

问题是SWIG生成的代码不是有效的Python,而是某种伪代码。例如

class SwigPyIterator(_object):

    ... note that method definitions are not Python:

    def value(self) -> "PyObject *" : return _vabamorf.SwigPyIterator_value(self)
    def incr(self, n : 'size_t'=1) -> "swig::SwigPyIterator *" : return _vabamorf.SwigPyIterator_incr(self, n)
    def decr(self, n : 'size_t'=1) -> "swig::SwigPyIterator *" : return _vabamorf.SwigPyIterator_decr(self, n)

我正在使用setuptools,以下是与SWIG相关的行:

swigging estnltk/pyvabamorf/vabamorf.i to estnltk/pyvabamorf/vabamorf_wrap.cpp
swig -python -c++ -py3 -o estnltk/pyvabamorf/vabamorf_wrap.cpp estnltk/pyvabamorf/vabamorf.i

有谁知道,是什么触发了这种行为以及如何解决这个问题?我以前能够解决这个问题,但我从来没有能够追踪使这个问题消失的具体变化。

1 个答案:

答案 0 :(得分:1)

大师把新手转向门口,用一只支撑着他的手说:“去年轻的新手,阅读他妈的手册。”所以新手开悟了。

好的,这是一个愚蠢的用户错误。 这实际上是预期的行为,这个伪代码实际上是function annotations

SWIG documentation

中也记录了这一点
The -py3 option will enable function annotation support. When used SWIG is able to generate proxy method definitions like this:

  def foo(self, bar : "int" = 0) -> "void" : ...

似乎我设法混淆了自己没有清除Python2 / Python3编译之间的所有文件,并且还因重构期间引入的一些导入相关错误而分心。

Dang,我有一段时间没有设法让自己大吃一惊。

相关问题