2014-12-04 70 views
2

这是一个奇怪的问题,有时会发生在我使用SWIG生成Python包装时。它同时适用于Swig 2.x和3.x版本。我不知道是什么触发它,但有时在代码重构后出现此错误。SWIG生成无效的Python包装代码

问题是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和这里的线相关痛饮:

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 

有谁知道,什么触发这个行为,以及如何解决它?过去我已经能够解决这个问题,但是我从未能够追踪导致这个问题消失的具体变化。

+0

嗯,它可以正确使用Python2,但不是Python3。 – Timo 2014-12-04 23:28:32

回答

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编译并得到了由重构过程中引入一些进口相关的错误也分心。

当,我没有设法让自己在一段时间内感到惊讶。