gym现在已经不再维护了,转而使用gymnasium。但是现在大部分项目依然使用gym的接口,gym的接口没有向后兼容性。
安装环境为Ubuntu20.04,python3.6至3.9的anaconda虚拟环境
直接安装gym是不会报错的,但是默认安装0.26.2
安装0.21.0几乎是必然出现:error in gym setup command: 'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.
也就是说gym的extras_require变量的写法不符合规范。
大部分博客甚至github上的issue([Bug Report] Version 0.21 could not be installed. · Issue #3176 · openai/gym · GitHub)都建议回退setuptools的版本至65.5.0或63.2.0或57.0.0诸如此类,将wheel回退至0.38.0。这种做法或许对部分情况是有效的,但对我来说无效,浪费了我大量时间。这里给出一个简单高效的方法:
首先使用
git clone https://github.com/openai/gym.git
cd gym
git checkout v0.21.0
下载到当前目录并切换tag为0.21.0
随后,回退pip,setuptools,wheel的版本,以防万一
python3.8 -m pip install pip==21
python3.8 -m pip install wheel==0.38.0
conda install setuptools==65.5.0
这里不要使用pip的--user选项给setuptools安装权限,--user不会安装虚拟环境里,只能使用conda安装,因此记得使用conda config添加一下中科大的镜像源来下载setuptools
最后打开gym文档中的setup.py,找到以下内容:
extras = {
"atari": ["ale-py~=0.7.1"],
"accept-rom-license": ["autorom[accept-rom-license]~=0.4.2"],
"box2d": ["box2d-py==2.3.5", "pyglet>=1.4.0"],
"classic_control": ["pyglet>=1.4.0"],
"mujoco": ["mujoco_py>=1.50, <2.0"],
"robotics": ["mujoco_py>=1.50, <2.0"],
"toy_text": ["scipy>=1.4.1"],
"other": ["lz4>=3.1.0", "opencv-python>=3.0"],
}
注意最后一行的"other": ["lz4>=3.1.0", "opencv-python>=3.0"],这里源代码是"opencv-python>=3.",问题就出现在这个0上,这么一看是不是显得特别XX(当时是真的想骂人,浪费时间),修改完成后在当前的虚拟环境中(一定要激活你需要安装的那个虚拟环境)使用
pip install -e .
即可正常完成安装,下面给一个简单的例程用于验证:
import gym
def main():
env = gym.make("CartPole-v1")
obs = env.reset()
print("初始观测:", obs)
total_reward = 0.0
done = False
step = 0
while not done and step < 1000:
action = env.action_space.sample()
obs, reward, done, info = env.step(action)
print(f"Step {step:03d} — 动作: {action}, 观测: {obs}, 奖励: {reward}, 完成: {done}")
total_reward += reward
step += 1
print(f"回合结束,总步数={step}, 累计奖励={total_reward}")
env.close()
if __name__ == "__main__":
main()