为了账号安全,请及时绑定邮箱和手机立即绑定

Python程序完成后炸了

Python程序完成后炸了

BIG阳 2021-07-25 13:34:18
我收到一个奇怪的 Python 错误。我正在执行一个看起来像这样的文件。if __name__ == '__main__':    MyClass().main()    print('Done 1')    print('Done 2')前面运行成功。但是当我把它改成这个时,我得到了奇怪的结果。if __name__ == '__main__':    myObject = MyClass()    myObject.main()    print('Done 1')    print('Done 2')输出看起来像这样。Done 1Done 2Exception ignored in: <function Viewer.__del__ at 0x0000021569EF72F0> Traceback (most recent call last):  File "C:\...\lib\site-packages\gym\envs\classic_control\rendering.py", line 143, in __del__  File "C:\...\lib\site-packages\gym\envs\classic_control\rendering.py", line 62, in close  File "C:\...\lib\site-packages\pyglet\window\win32\__init__.py", line 305, in close  File "C:\...\lib\site-packages\pyglet\window\__init__.py", line 770, in closeImportError: sys.meta_path is None, Python is likely shutting downProcess finished with exit code 0最后print一行后有一个空行。当最后一行没有行尾标记时,也会发生同样的事情。无论是在 PyCharm 中使用run命令还是从终端运行它,我都会得到相同的结果。正如您可能从错误行中看出的那样,该程序生成了一个动画。(这是 OpenAI 健身房的推车杆问题。)由于程序在错误之前完成,所以这不是一场灾难。但我想了解发生了什么。谢谢。
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

Python 为__del__将在实例被垃圾收集时调用的类提供了一个dunder 方法,如果它们被垃圾收集。


使用时,该__del__方法通常会执行某种清理。


由于无意中阻止对象被收集这一事实相当容易,因此通常建议不要依赖__del__执行清理(而不是上下文管理器__exit__或显式.close()方法)。


您的错误突出了避免依赖的不同原因__del__,但是:在关闭期间__del__将被调用,但可能在它依赖的其他东西被释放之后。


评论中链接的关于 github 问题的建议解决方法应该具有指导意义,因为它们都确保在清理所依赖的事物(例如sys.meta_path)仍处于定义/尚未释放状态时完成清理,例如:


try:

    del env

except ImportError:

    pass


env = gym.make('CartPole-v0')

...

env.env.close()

和(可能,但效率或清晰得多)


import gc; gc.collect()


查看完整回答
反对 回复 2021-08-03
  • 1 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信