使用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
相关产品推荐
相关产品推荐

