gym更新到Gymnasium后需要修改的位置
-
- [✅ 1. **导入方式变更**](#✅ 1. 导入方式变更)
- [✅ 2. **环境创建不变**](#✅ 2. 环境创建不变)
- [✅ 3. **`reset()` 返回值变更**](#✅ 3.
reset()返回值变更) - [✅ 4. **`step()` 返回值变更(最重要!)**](#✅ 4.
step()返回值变更(最重要!)) -
- [旧版(4 元组)](#旧版(4 元组))
- [新版(5 元组)](#新版(5 元组))
- [✅ 如果你仍需要 `done` 变量:](#✅ 如果你仍需要
done变量:)
- [✅ 5. **训练循环典型修改示例**](#✅ 5. 训练循环典型修改示例)
-
- [旧版代码(gym ≤0.21)](#旧版代码(gym ≤0.21))
- 新版代码(Gymnasium)
- [✅ 6. **Wrapper 和自定义环境**](#✅ 6. Wrapper 和自定义环境)
- [✅ 7. **其他注意事项**](#✅ 7. 其他注意事项)
- [✅ 8. **安装与版本**](#✅ 8. 安装与版本)
- [✅ 总结:你需要修改的位置](#✅ 总结:你需要修改的位置)
-
- [🔧 小技巧:快速检查](#🔧 小技巧:快速检查)
个人学习笔记,仅供自己方便查阅,无其他用途和意思。
将代码从 旧版 gym(≤0.21) 迁移到 新版 Gymnasium(≥0.26,官方继任者) 时,需要修改以下几个关键位置。以下是完整的迁移指南:
✅ 1. 导入方式变更
旧版(gym)
python
import gym
新版(Gymnasium)
python
import gymnasium as gym
💡 Gymnasium 是 OpenAI Gym 的官方维护版本,API 兼容但更规范。
✅ 2. 环境创建不变
python
env = gym.make("CartPole-v1") # 依然有效
✅ 这一行不需要改。
⚠️ 但注意:
CartPole-v0已被标记为过时,建议使用v1。
✅ 3. reset() 返回值变更
旧版
python
state = env.reset() # 返回 observation(如 np.ndarray)
新版(Gymnasium)
python
state, info = env.reset() # 返回 (observation, info_dict)
📌 必须解包! 否则
state会是(obs, {})元组,导致后续错误。
✅ 4. step() 返回值变更(最重要!)
旧版(4 元组)
python
next_state, reward, done, info = env.step(action)
新版(5 元组)
python
next_state, reward, terminated, truncated, info = env.step(action)
terminated: 因任务逻辑结束(如掉杆、到达目标)truncated: 因外部限制结束(如超时、步数限制)- 逻辑上的 "done" =
terminated or truncated
✅ 如果你仍需要 done 变量:
python
next_state, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
✅ 5. 训练循环典型修改示例
旧版代码(gym ≤0.21)
python
state = env.reset()
for _ in range(max_steps):
action = agent.get_action(state)
next_state, reward, done, info = env.step(action)
agent.store(state, action, reward, next_state, done)
state = next_state
if done:
break
新版代码(Gymnasium)
python
state, info = env.reset() # ← 解包 reset()
for _ in range(max_steps):
action = agent.get_action(state)
next_state, reward, terminated, truncated, info = env.step(action) # ← 5 个返回值
done = terminated or truncated # ← 手动合并
agent.store(state, action, reward, next_state, done)
state = next_state
if done:
break
🔁 每个 episode 开始都要调用
env.reset()并解包!
✅ 6. Wrapper 和自定义环境
如果你写了自定义环境或使用了 wrapper,需确保:
reset()返回(obs, info)step()返回(obs, reward, terminated, truncated, info)info必须是字典(可为空{})
示例:
python
class MyEnv(gym.Env):
def reset(self, seed=None, options=None):
super().reset(seed=seed)
obs = ... # your observation
return obs, {} # ← 必须返回 tuple
def step(self, action):
...
return obs, reward, terminated, truncated, {}
✅ 7. 其他注意事项
| 项目 | 说明 |
|---|---|
render() |
用法基本不变,但某些模式(如 human)行为可能微调 |
seed() |
已弃用!改用 reset(seed=123) |
action_space.sample() |
依然有效 |
observation_space |
依然有效 |
✅ 8. 安装与版本
bash
# 卸载旧 gym(可选)
pip uninstall gym
# 安装 Gymnasium
pip install gymnasium[box2d] # 如果用 CarRacing 等
# 或
pip install gymnasium
✅
gymnasium和旧gym可共存,但建议统一用gymnasium。
✅ 总结:你需要修改的位置
| 文件/函数 | 修改内容 |
|---|---|
所有 import |
import gym → import gymnasium as gym |
env.reset() 调用处 |
state = env.reset() → state, info = env.reset() |
env.step() 调用处 |
解包为 5 个变量,并用 done = terminated or truncated |
| 自定义环境 | 确保 reset 和 step 返回正确元组 |
| 经验回放存储 | 确保存入的是纯 observation(不是 tuple) |
🔧 小技巧:快速检查
在训练开始前加一行测试:
python
obs, info = env.reset()
print("Reset returns:", type(obs), obs.shape, type(info))
obs, r, term, trunc, info = env.step(env.action_space.sample())
print("Step returns:", len([obs, r, term, trunc, info]))
如果输出符合预期,说明迁移成功。
完成以上修改后,RL代码就能在 Gymnasium 上稳定运行,并兼容 NumPy ≥1.24、PyTorch 等新版依赖。