You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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错误。

解决方案

  1. 避免提前调用env.close():如果后续还需要使用该环境实例,不要在循环结束后立即调用env.close(),可以在所有操作完成后再执行关闭。
  2. 重新创建环境实例:每次需要重置环境前,重新调用gym.make()创建新的环境对象,示例代码:
# 每次重置前重新创建环境
env = gym.make("CartPole-v1", render_mode="human")
state = env.reset()
  1. 使用非可视化渲染模式:如果仅需要获取状态向量而不需要可视化界面,可以将render_mode设置为"rgb_array"或不指定(默认None),这样不会创建pygame窗口,也就不会出现窗口关闭后的报错问题:
env = gym.make("CartPole-v1")  # 默认无渲染模式
# 或
env = gym.make("CartPole-v1", render_mode="rgb_array")

内容的提问来源于stack exchange,提问作者Ritik Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:45:01