在Google Colab训练CartPole-v0模型时遇‘解包变量过多’错误求助
解决CartPole-v0训练中"too many variables to unpack"错误
错误根源
你的代码里直接引发报错的问题是:调用env.close()关闭环境后,又执行了env.step(1)操作已失效的环境实例,导致后续重新创建的环境被DummyVecEnv包装后状态异常,最终在model.learn()运行时,环境返回的step结果格式不符合预期,触发解包错误。
另外补充:如果你的Gym版本是1.x,原生CartPole-v0的step()方法会返回5个值(state, reward, terminated, truncated, info),你测试循环里用4个变量解包的写法也存在版本兼容隐患。
修正方案
- 删除非法操作:把
env.close()之后的env.step(1)语句彻底删掉,绝对不要操作已关闭的环境。 - 适配Gym版本:如果使用Gym 1.x,调整测试循环里的step解包逻辑,适配5返回值格式:
- 将循环内的
done变量替换为terminated和truncated - 调整step解包语句,同时更新循环终止条件
- 将循环内的
修正后的完整代码
!pip install stable-baselines3[extra] !apt-get install x11-utils > /dev/null 2>&1 !pip install pyglet > /dev/null 2>&1 !apt-get install -y xvfb python-opengl > /dev/null 2>&1 !pip install gym pyvirtualdisplay > /dev/null 2>&1 import tensorflow as tf import os import gym import numpy as np import matplotlib.pyplot as plt from IPython import display as ipythondisplay from stable_baselines3 import PPO from stable_baselines3.common.vec_env import DummyVecEnv from stable_baselines3.common.evaluation import evaluate_policy from pyvirtualdisplay import Display display = Display(visible=0, size=(400, 300)) display.start() environment_name = 'CartPole-v0' env = gym.make(environment_name) episodes = 5 for episode in range(1, episodes+1): state = env.reset() terminated = False truncated = False score = 0 while not terminated and not truncated: prev_screen = env.render(mode='rgb_array') plt.imshow(prev_screen) action = env.action_space.sample() # 适配Gym 1.x的step返回格式 n_state, reward, terminated, truncated, info = env.step(action) score += reward print('Episode:{} Score:{}'.format(episode, score)) env.close() log_path = os.path.join('Training','Logs') # 创建全新的环境实例并包装 env = gym.make(environment_name) env = DummyVecEnv([lambda: env]) model = PPO('MlpPolicy', env, verbose=1, tensorboard_log=log_path) model.learn(total_timesteps=20000)
内容的提问来源于stack exchange,提问作者Ayushman Tripathi
相关产品推荐
相关产品推荐

