跟随Nicholas Renotte马里奥RL项目时遇TypeError问题求助
解决方案:JoypadSpace.reset() 不支持 seed 参数问题
问题根源
你遇到的错误是因为DummyVecEnv调用reset()时会自动传递seed参数,但旧版本gym-super-mario-bros依赖的JoypadSpace(来自nes_py库)的reset方法没定义这个参数,导致参数不匹配。
修复方案
方案1:快速修补JoypadSpace的reset方法
在创建JoypadSpace实例前,给它的reset方法添加参数兼容处理:
from nes_py.wrappers import JoypadSpace # 重写reset方法,忽略多余参数 original_reset = JoypadSpace.reset def patched_reset(self, **kwargs): return original_reset(self) JoypadSpace.reset = patched_reset
这段代码会让JoypadSpace的reset方法自动忽略seed等额外参数,直接执行原有逻辑。
方案2:回退到兼容的依赖版本
如果不想改代码,直接安装和教程匹配的依赖版本,从根源避免版本冲突:
- 先卸载现有版本:
pip uninstall -y nes-py gym-super-mario-bros - 安装兼容版本:
pip install nes-py==8.2.1 gym-super-mario-bros==7.3.0
这些版本的JoypadSpace不需要额外参数,和DummyVecEnv的调用逻辑完全适配。
方案3:在环境封装时处理reset参数
创建DummyVecEnv时,给底层环境套一层参数过滤的包装:
from stable_baselines3.common.env_util import DummyVecEnv def wrap_env(): env = gym_super_mario_bros.make('SuperMarioBros-v0') env = JoypadSpace(env, SIMPLE_MOVEMENT) env = GrayScaleObservation(env, keep_dim=True) # 重写当前环境的reset方法,忽略多余参数 original_env_reset = env.reset def env_reset(**kwargs): return original_env_reset() env.reset = env_reset return env # 用包装后的函数创建DummyVecEnv env = DummyVecEnv([lambda: wrap_env()]) env = VecFrameStack(env, 4, channels_order='last')
这样底层环境的reset方法会自动丢弃seed参数,不会触发报错。
验证修复
执行完任意一种方案后,再调用state = env.reset()就能正常运行,不会再出现TypeError。
内容的提问来源于stack exchange,提问作者Chirag Routray
相关产品推荐
相关产品推荐

