我收到一个奇怪的 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()
添加回答
举报
0/150
提交
取消