python3.6使用spyder时,用gym运行render出错解决,以及合理的中断方法建议

前言

在网上找了一个用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如何捕获中断

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值