使用Gymnasium库出现'display surface Quit'错误的技术问询
CartPole-v1环境调用env.close()后重置报错问题
在Jupyter Notebook中运行完包含env.close()的CartPole-v1环境代码后,再次执行env.reset()会触发display surface Quit错误,必须重新创建环境实例才能继续运行代码。原本期望通过env.reset()获取长度为4的状态向量,实际触发报错。
重现代码
import os import gymnasium as gym environment_name= "CartPole-v1" env=gym.make(environment_name,render_mode="human") episodes=5 for episode in range(1,episodes+1): state=env.reset() done=False score=0 while not done: env.render() action=env.action_space.sample() n_state,reward,terminated,truncated,info=env.step(action) score+=reward done=terminated or truncated print('Episode:{} score:{}'.format(episode,score)) env.close()
正常运行输出
Episode:1 score:25.0 Episode:2 score:21.0 Episode:3 score:18.0 Episode:4 score:17.0 Episode:5 score:11.0
报错回溯信息
--------------------------------------------------------------------------- error Traceback (most recent call last) Cell In[4], line 1 ----> 1 env.reset() File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\gymnasium\wrappers\time_limit.py:75, in TimeLimit.reset(self, **kwargs) 66 """Resets the environment with :param:`**kwargs` and sets the number of steps elapsed to zero. 67 68 Args: (...) 72 The reset environment 73 """ 74 self._elapsed_steps = 0 ---> 75 return self.env.reset(**kwargs) File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\gymnasium\wrappers\order_enforcing.py:61, in OrderEnforcing.reset(self, **kwargs) 59 """Resets the environment with `kwargs`.""" 60 self._has_reset = True ---> 61 return self.env.reset(**kwargs) File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\gymnasium\wrappers\env_checker.py:57, in PassiveEnvChecker.reset(self, **kwargs) 55 return env_reset_passive_checker(self.env, **kwargs) 56 else: ---> 57 return self.env.reset(**kwargs) File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\gymnasium\envs\classic_control\cartpole.py:209, in CartPoleEnv.reset(self, seed, options) 206 self.steps_beyond_terminated = None 208 if self.render_mode == "human": ---> 209 self.render() 210 return np.array(self.state, dtype=np.float32), {} File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\gymnasium\envs\classic_control\cartpole.py:299, in CartPoleEnv.render(self) 296 gfxdraw.hline(self.surf, 0, self.screen_width, carty, (0, 0, 0)) 298 self.surf = pygame.transform.flip(self.surf, False, True) ---> 299 self.screen.blit(self.surf, (0, 0)) 300 if self.render_mode == "human": 301 pygame.event.pump() error: display Surface quit
问题原因与解决方案
原因
调用env.close()后,Gymnasium会关闭pygame创建的显示窗口并释放相关资源,此时原环境实例已经处于失效状态,无法再调用reset()或其他需要渲染的方法,否则会触发pygame的display Surface quit错误。
解决方案
- 避免提前调用
env.close():如果后续还需要使用该环境实例,不要在循环结束后立即调用env.close(),可以在所有操作完成后再执行关闭。 - 重新创建环境实例:每次需要重置环境前,重新调用
gym.make()创建新的环境对象,示例代码:
# 每次重置前重新创建环境 env = gym.make("CartPole-v1", render_mode="human") state = env.reset()
- 使用非可视化渲染模式:如果仅需要获取状态向量而不需要可视化界面,可以将
render_mode设置为"rgb_array"或不指定(默认None),这样不会创建pygame窗口,也就不会出现窗口关闭后的报错问题:
env = gym.make("CartPole-v1") # 默认无渲染模式 # 或 env = gym.make("CartPole-v1", render_mode="rgb_array")
内容的提问来源于stack exchange,提问作者Ritik Jain
相关产品推荐
相关产品推荐

