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

修改JoypadSpace.reset()解决seed参数错误后遇解包错误的修复方法

修复 JoypadSpace.reset() 相关的 TypeError 和 ValueError 问题

问题重现

先遇到错误:

TypeError: JoypadSpace.reset() got an unexpected keyword argument 'seed'

参考修改方案,用lambda替换JoypadSpace.reset方法后,运行以下代码:

from nes_py.wrappers import JoypadSpace
JoypadSpace.reset = lambda self, **kwargs: self.env.reset(**kwargs)

from gym_super_mario_bros.actions import SIMPLE_MOVEMENT
env = JoypadSpace(env, SIMPLE_MOVEMENT)

from gym.wrappers import GrayScaleObservation
env = GrayScaleObservation(env, keep_dim=True)

from stable_baselines3.common.vec_env import DummyVecEnv    
env = DummyVecEnv([lambda: env])

gameState = env.reset()
obs, _, _, _, _ = env.step(1)
env.close()

出现新错误:

ValueError: too many values to unpack (expected 2)

错误栈详情:

Traceback (most recent call last) 
  <ipython-input-3-7521e0795c59> in <cell line: 37>()
  35 
  36 # Size of frame output
  ---> 37 gameState = env.reset()
  38 obs, _, _, _, _ = env.step(1)
  39 env.close()

/usr/local/lib/python3.10/dist-packages/stable_baselines3/common/vec_env/dummy_vec_env.py in reset(self) -> VecEnvObs:
  74 def reset(self) -> VecEnvObs:
  75 for env_idx in range(self.num_envs):
  ---> 76 obs, self.reset_infos[env_idx] = self.envs[env_idx].reset(seed=self._seeds[env_idx])
  77 self._save_obs(env_idx, obs)
  78 # Seeds are only used once
ValueError: too many values to unpack (expected 2)

问题原因

Stable Baselines3 的 DummyVecEnv 要求环境的 reset() 方法返回 (observation, info) 二元组(符合新版 Gym/Gymnasium 规范),但之前的 lambda 替换方案没有保证这一点:

  • 若底层环境是旧版 Gym,reset() 仅返回单个 observation 值,lambda 直接返回该值后,DummyVecEnv 尝试拆分为两个值会引发错误;
  • 若底层环境是新版,reset() 返回二元组,但旧版 JoypadSpace 未适配该格式,导致返回结果的处理逻辑不兼容。

修复方案

替换原来的 lambda 为兼容新旧版 Gym 的补丁函数,确保 reset() 始终返回标准的二元组格式:

def patched_reset(self, **kwargs):
    reset_result = self.env.reset(**kwargs)
    # 适配旧版Gym(仅返回observation)和新版(返回obs+info元组)
    if isinstance(reset_result, tuple):
        return reset_result
    return reset_result, {}

# 应用补丁
from nes_py.wrappers import JoypadSpace
JoypadSpace.reset = patched_reset

之后按原有流程初始化环境即可解决两个错误。


内容的提问来源于stack exchange,提问作者Gustavo Mirapalheta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:37:38