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

使用nes_py与gym_super_mario_bros遇解包值不足的ValueError求助

解决gym-super-mario-bros中ValueError: not enough values to unpack (expected 5, got 4)错误

问题重现

运行从gym-super-mario-bros官方PyPi文档复制的代码:

from nes_py.wrappers import JoypadSpace
import gym_super_mario_bros
from gym_super_mario_bros.actions import SIMPLE_MOVEMENT
env = gym_super_mario_bros.make('SuperMarioBros-v0')
env = JoypadSpace(env, SIMPLE_MOVEMENT)

done = True
for step in range(5000):
    if done:
        state = env.reset()
    state, reward, done, info = env.step(env.action_space.sample())
    env.render()

env.close()

执行后出现关键错误:

ValueError: not enough values to unpack (expected 5, got 4)

错误原因

这个错误源于Gym API的版本差异:

  • 旧版Gym(0.25及以下)的step()方法返回4个值:(state, reward, done, info)
  • 新版Gym(0.26及以上)的step()方法返回5个值:(observation, reward, terminated, truncated, info),同时reset()方法也从返回单个观测值改为返回(obs, info)元组

当前环境被新版Gym的包装器(比如TimeLimit)处理后,要求使用新API的返回值结构,但代码仍按旧API的方式解包,导致不匹配。

解决方案

方案1:适配新版Gym API修改代码

直接修改代码以兼容新版Gym的API规范,同时使用官方推荐的SuperMarioBros-v3环境版本:

from nes_py.wrappers import JoypadSpace
import gym_super_mario_bros
from gym_super_mario_bros.actions import SIMPLE_MOVEMENT
env = gym_super_mario_bros.make('SuperMarioBros-v3')
env = JoypadSpace(env, SIMPLE_MOVEMENT)

terminated = truncated = True
for step in range(5000):
    if terminated or truncated:
        state, info = env.reset()  # 新版reset返回(观测值, 信息字典)
    # 按新版step返回的5个值解包
    state, reward, terminated, truncated, info = env.step(env.action_space.sample())
    env.render()

env.close()

方案2:安装兼容版本的依赖

如果希望继续使用旧版API的代码写法,可以安装与旧版Gym兼容的依赖版本:

pip install gym==0.25.2 nes-py==8.2.1 gym-super-mario-bros==7.3.0

安装完成后,原代码即可正常运行(也建议将环境替换为SuperMarioBros-v3以消除版本警告)。

内容的提问来源于stack exchange,提问作者Kshipra Jadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:09:23