Python程序完成后炸了

我收到一个奇怪的 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 1

Done 2

Exception 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 close

ImportError: sys.meta_path is None, Python is likely shutting down


Process finished with exit code 0

最后print一行后有一个空行。当最后一行没有行尾标记时,也会发生同样的事情。


无论是在 PyCharm 中使用run命令还是从终端运行它,我都会得到相同的结果。


正如您可能从错误行中看出的那样,该程序生成了一个动画。(这是 OpenAI 健身房的推车杆问题。)


由于程序在错误之前完成,所以这不是一场灾难。但我想了解发生了什么。


谢谢。


BIG阳
浏览 160回答 1
1回答

幕布斯6054654

Python 为__del__将在实例被垃圾收集时调用的类提供了一个dunder 方法,如果它们被垃圾收集。使用时,该__del__方法通常会执行某种清理。由于无意中阻止对象被收集这一事实相当容易,因此通常建议不要依赖__del__执行清理(而不是上下文管理器__exit__或显式.close()方法)。您的错误突出了避免依赖的不同原因__del__,但是:在关闭期间__del__将被调用,但可能在它依赖的其他东西被释放之后。评论中链接的关于 github 问题的建议解决方法应该具有指导意义,因为它们都确保在清理所依赖的事物(例如sys.meta_path)仍处于定义/尚未释放状态时完成清理,例如:try:&nbsp; &nbsp; del envexcept ImportError:&nbsp; &nbsp; pass和env = gym.make('CartPole-v0')...env.env.close()和(可能,但效率或清晰得多)import gc; gc.collect()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python