问题描述
今天在运行openai给出的ppo2的baseline的时候遇到了以下bug:
File "/root/code/baselines_openai/baselines/common/cmd_util.py", line 12, in <module>
from gym.wrappers import FlattenObservation, FilterObservation
ImportError: cannot import name 'FlattenObservation' from 'gym.wrappers'
去查阅了[1],将gym版本改成0.15.4,还是没有解决问题。
然后去[2]查了gym0.15.4的文件结构,FlattenObservation是在flatten_observation.py下的,于是将代码改成了以下:
from gym.wrappers.flatten_observation import FlattenObservation, FilterObservation
但出现了新的错误:
Traceback (most recent call last):
File "/opt/conda/envs/tensorflow_gpu_114/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/opt/conda/envs/tensorflow_gpu_114/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/root/code/baselines_openai/baselines/run.py", line 12, in <module>
from baselines.common.cmd_util import common_arg_parser, parse_unknown_args, make_vec_env, make_env
File "/root/code/baselines_openai/baselines/common/cmd_util.py", line 12, in <module>
from gym.wrappers.flatten_observation import FlattenObservation
ModuleNotFoundError: No module named 'gym.wrappers.flatten_observation'
很怪,思前想后打算加入绝对路径直接定位包中文件的路径了。
解决方案-第一版
将代码修改为
import sys
sys.path.append('/opt/conda/envs/tensorflow_gpu_114/lib/python3.7/site-packages/gym/wrappers')
import gym
from flatten_observation import FlattenObservation
from filter_observation import FilterObservation
成功解决该bug。
解决方案-第二版
第一版的解决方案毕竟不是长久之计,总不可能所有带gym的文件里都加上绝对路径叭?肯定是有哪里有问题!
受[3]的启发,既然gym可能找不到make这个attribute,自然也可能找不到gym.wrappers.flatten_observation,会不会是我的环境变量里有含有名字是gym的文件夹或文件呢?
果不其然,发现了环境变量中有一条包含了名称是gym的文件夹,注释掉这条环境变量后,重启终端,解决了!
后记
原因有点魔幻,好在解决了,这提醒我们不能随便加入环境变量;在不再使用该项目之后,要及时对该项目的环境变量进行删除。
参考链接
[1] ImportError: cannot import name 'FlattenObservation' · Issue #1058 · openai/baselines · GitHub
[2] https://github.com/openai/gym/tree/0.15.4/gym/wrappers
[3] python改错——1.AttributeError: module 'gym' has no attribute 'make'_我叫高好看的博客-CSDN博客