gym.wrappers.Monitor()废弃后的替代方法与报错解决方案
gym废弃
wrappers.Monitor接口替代方案 问题背景
示例来自Miguel Morales所著《Grokking Deep Reinforcement Learning》第8章,原书代码使用的wrappers.Monitor接口在新版gym中已被废弃,原代码逻辑如下:
env = wrappers.Monitor( env, mdir, force=True, mode=monitor_mode, video_callable=lambda e_idx: record) if monitor_mode else env
实测网上流传的两种替代方案均存在报错:
- gnwrapper.Monitor方案:安装
gym-notebook-wrapper依赖、导入gnwrapper后将代码改写为
运行后抛出env = gnwrapper.Monitor(gym.make(env_name),directory="./")[WinError 2] The system cannot find the file specified错误 - gym原生
RecordVideo方案:从gym.wrappers导入RecordVideo后将代码改写为
运行CartPole环境时抛出env = RecordVideo(gym.make(env_name), "./")AttributeError: 'CartPoleEnv' object has no attribute 'videos'属性错误
报错修复与正确实现
方案一:修复gnwrapper.Monitor报错
[WinError 2]报错的核心原因是系统缺少ffmpeg依赖,gnwrapper依赖ffmpeg完成视频编码,Windows系统默认没有预装该组件:
- 下载ffmpeg Windows预编译包,解压后将包内bin目录的路径添加到系统环境变量Path
- 重启Python运行环境后重新执行代码即可正常录制,该方案更适合在Jupyter Notebook中内联展示录制视频的场景
方案二:修复gym原生RecordVideo报错(更推荐,无额外依赖)
'CartPoleEnv' object has no attribute 'videos'是gym版本兼容问题:0.26及之后版本的gym要求录制视频的环境必须指定render_mode="rgb_array",直接传入裸环境会缺失录制所需的内置属性,正确写法完全对齐原Monitor的功能:
import gym from gym.wrappers import RecordVideo # 初始化环境时必须指定render_mode为rgb_array,这是视频录制的前置要求 env = gym.make(env_name, render_mode="rgb_array") # 封装录制 wrapper env = RecordVideo( env, video_folder="./videos", # 建议指定专门的视频存储目录,避免根目录权限问题 episode_trigger=lambda e_idx: record, # 与原代码video_callable逻辑完全一致,入参是回合序号,返回True则录制当前回合 force=True # 对齐原Monitor的force参数,允许覆盖目录下已有的同名录制文件 )
注意:如果使用的是0.25及更早版本的gym,不需要给gym.make传render_mode参数,只需要在封装RecordVideo前手动给环境补全缺失的属性即可兼容:
env = gym.make(env_name) env.videos = [] # 补全老版本缺失的内置属性 env = RecordVideo( env, video_folder="./videos", episode_trigger=lambda e_idx: record, force=True )
如果需要对齐原Monitor的mode参数逻辑,直接修改episode_trigger的判断规则即可:比如训练阶段每100回合录制一次、评估阶段全量录制,直接在lambda表达式中写入对应判断条件就行。
内容的提问来源于stack exchange,提问作者user13474103
相关产品推荐
相关产品推荐

