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

跟随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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:33:25