当我使用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


有谁知道,什么触发了这种行为以及如何解决它?过去,我已经能够解决此问题,但是我从未能够找到使此问题消失的特定更改。

最佳答案

主人将新手转向门,用支持的手扶着他的肩膀说:“去年轻的新手,读一下《他妈的手册》。”因此,新手开悟了。

好的,这是一个愚蠢的用户错误。
这实际上是预期的行为,而此伪代码实际上是称为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编译之间的所有文件,并且还因重构期间引入的一些与导入相关的错误而分心。

堂,我有一段时间没有让自己感到惊讶了。

10-07 19:08
查看更多