前言
在网上找了一个用gym中的cartpole(小车倒立摆)做dqn的demo,下载下来想可视化训练过程,就是看看动画,就加了一句env.render(),env是gym环境赋值的变量名,然后在anaconda中的spyder下运行,崩了
File "**/anaconda3/lib/python3.6/site-packages/pyglet/canvas/base.py", line 65, in get_screens
raise NotImplementedError('abstract')
NotImplementedError: abstrac
报错的最后一段大致是这个样子,上网搜了一下,发现很少有人解释这是spyder的问题,特发一文强调一下。
解决
解决方法是我在Error following env.render() for OpenAI看到的,具体操作就是降低pyglet的版本,在anaconda prompt中激活环境,然后输入
pip install pyglet==1.2.4
重启spyder即可解决问题。
当初我看到这个的时候我其实很不情愿用低版本的,因此我重新下了一遍pyglet,还是不行。后来我在anaconda prompt下敲了gym的测试代码
import gym
env = gym.make(‘CartPole-v0’)
env.reset()
env.render()
跑了一下,偶买噶的er,没有问题啊,那就只能是spyder的问题了,运行之前说过的那句,完美解决问题。
想关闭窗口接着敲
env.close()
恰当地关闭gym环境窗口
跑程序不想跑了,ctrl+c中断或者点击ipython右上角的“停止”按钮是方便的做法,但是可视化gym环境的窗口没关上,点击“×”关闭,会蹦出来windows的调试窗口,然后ipython也会崩
(暴露了我的渣渣笔记本配置,轻喷)
虽然只要关闭这个console就行了,但是不是很讨厌?
那怎么办呢
中断是一个信号,定义一个函数处理这个信号
import signal
import sys
def CtrlCHandler(signum, frame):
env.close()
sys.exit(0)
然后在你的env.render()前加一句
signal.signal(signal.SIGINT, CtrlCHandler)
这样你的程序被中断时,gym窗口也会关闭。
注意env这个变量名,根据你自己的命名更改哦(虽然大家大概都会用这个变量名)
还有别的方法,比如try捕获中断,但说实话,python这种靠缩进的,我觉得还是我提到的这种更方便,如果想了解try这一种,点击python如何捕获中断