【问题标题】:SystemError: <built-in function xxx_iterator> returned a result with an error setSystemError: <built-in function xxx_iterator> 返回了带有错误集的结果
【发布时间】:2017-09-24 13:32:31
【问题描述】:

我正在尝试从以下位置升级: SWIG 2.0.11 和 Python 2.7.12 到 SWIG 3.0.12 和 Python 3.6, 但是当我在任何迭代器上运行测试时出现以下异常(使用 %template 自动生成):

SystemError: <built-in function xxx_iterator> returned a result with an error set

例如,即使是最简单的迭代也会失败:

Traceback (most recent call last):
File "testRender.py", line 459, in testRender
    for v in vertices:
File "ncore.py", line 90833, in __iter__
    return self.iterator()
File "ncore.py", line 90830, in iterator
    return _ncore.Vertices_iterator(self)
SystemError: <built-in function Vertices_iterator> returned a result with an error set

有什么想法吗?

再一次,这一切都与 SWIG 2.0.11 和 Python 2.7.12 配合得很好......

编辑:添加更简单的示例:

它可以是任何 %template-generated 迭代器,例如,在 .i 文件中定义的这个模板:

%template(Ints) std::list<int>;

使用这个简单的代码会失败:

intsList = ncore.Ints()
intsList.append(1)
intsList.append(2)
for i in intsList:
    print(i)

带有类似这样的消息:

Traceback (most recent call last):
File "testRender.py", line 459, in testRender
    for i in intsList:
File "ncore.py", line 90833, in __iter__
    return self.iterator()
File "ncore.py", line 90830, in iterator
    return _ncore.Ints_iterator(self)
SystemError: <built-in function Ints_iterator> returned a result with an error set

【问题讨论】:

  • 不知道Vertices_iterator的源代码是不可能提供任何帮助的。
  • 仅供参考,看起来此提交 (github.com/swig/swig/pull/560/files) 试图修复类似问题...
  • 如果您希望我能够查看此内容,您需要一个真正的最小完整示例,我可以在自己的调试器中运行该示例。我之前忽略了它,因为没有一个,即使有赏金我仍然无能为力。回溯显示了至少 459 行 Python 代码,您在“简单测试用例”中没有显示这些代码可能是相关的,并且天知道在 ncore C 和 Python 生成的代码的其余部分中还有多少其他代码。如果您真的想要一个答案,您需要将其隔离为我们可以重现的东西。

标签: python c++ swig


【解决方案1】:

这很奇怪,只是从头开始重新编译所有内容。然后我测试了您的简化示例(如果理解正确):

Mytest.i:

%module mytest                                                                                             
%{                                                                                                       
    #include <list>
     using namespace std;                                                                                     
%}                                                                                                       

%include "std_list.i"
namespace std {                                                                                          
    %template(Ints) list<int>;                                                           
}   

编译步骤:

swig -Wall -c++ -python -py3 -o mytest_wrap.cpp mytest.i
g++ -c -g -ansi mytest_wrap.cpp -I/usr/local/include/python3.6m/ -fPIC -o mytest_wrap.o
g++ -g -ansi -o _mytest.so mytest_wrap.o -shared

然后,在将 mytest 模块导入 python 之后,一切都像魅力一样工作。

测试配置:

  • dockerized Ubuntu16.04:Python 3.6.1、SWIG 3.0.12、g++ 5.4。
  • dockerized Centos6:Python 3.6.1、SWIG 3.0.12、g++(4.9.2 和 4.4.7)

【讨论】:

  • 感谢测试。我应该提到我们在 Centos 6 上尝试使用 g++ 4.6 和 g++ 4.9,在 Windows 上使用 MSVS Pro 2013。
  • @DevanWilliams 在 Centos6/g++ 4.6 上也为我工作。这个简单的建议示例会产生完全相同的问题吗?有编译警告吗?
【解决方案2】:

虽然这是一个比较老的问题,但最近我在 CentOS7 docker 中处理 SELinux 和 setools 时遇到了类似的问题 (&lt;built-in function delete_qpol_iterator_t&gt; returned a result with an error set)。从source code 构建和安装 libsepol 和 libselinux 可能会解决问题。

所以我想更新相关的库和其他依赖项可能会有用。

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2019-06-13
    • 2021-04-05
    • 2020-06-30
    相关资源
    最近更新 更多