修改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
相关产品推荐
相关产品推荐

