仅当代码在特定目录中时出错:gym.Error.Error:无法重新注册id



我正在尝试将simglucose包与OpenAI gym一起使用。我遇到了一个奇怪的问题;当我在某个目录(让我们称之为problem_dir/(中运行下面的代码时,它失败了,并出现以下错误。但是,当我将文件复制粘贴到其他位置时,它运行良好(我尝试了大约10个其他位置,包括problem_dir/的子目录和父目录(。当Python文件位于problem_dir/中时,是什么原因导致类似以下错误,但

问题代码:

import gym
from gym.envs.registration import register
register(
id='simglucose-adolescent2-v0',
entry_point='simglucose.envs:T1DSimEnv',
kwargs={'patient_name': 'adolescent#002'}
)
env = gym.make('simglucose-adolescent2-v0') # ERROR HERE

错误:

(seldonian_library_env) james@james-desktop2019-Ub18:~$ python seldonian_library_repos/Engine/seldonian/RL/environments/temp.py 
/home/james/anaconda3/envs/seldonian_library_env/lib/python3.8/site-packages/gym/envs/registration.py:17: PkgResourcesDeprecationWarning: Parameters to load are deprecated.  Call .resolve and .require separately.
result = entry_point.load(False)
Traceback (most recent call last):
File "seldonian_library_repos/Engine/seldonian/RL/environments/temp.py", line 8, in <module>
env = gym.make('simglucose-adolescent2-v0')
File "/home/james/anaconda3/envs/seldonian_library_env/lib/python3.8/site-packages/gym/envs/registration.py", line 164, in make
return registry.make(id)
File "/home/james/anaconda3/envs/seldonian_library_env/lib/python3.8/site-packages/gym/envs/registration.py", line 122, in make
env = spec.make()
File "/home/james/anaconda3/envs/seldonian_library_env/lib/python3.8/site-packages/gym/envs/registration.py", line 88, in make
cls = load(self._entry_point)
File "/home/james/anaconda3/envs/seldonian_library_env/lib/python3.8/site-packages/gym/envs/registration.py", line 17, in load
result = entry_point.load(False)
File "/home/james/anaconda3/envs/seldonian_library_env/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2450, in load
return self.resolve()
File "/home/james/anaconda3/envs/seldonian_library_env/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2456, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "/home/james/seldonian_library_repos/Engine/seldonian/RL/environments/simglucose.py", line 62, in <module>
register(
File "/home/james/anaconda3/envs/seldonian_library_env/lib/python3.8/site-packages/gym/envs/registration.py", line 161, in register
return registry.register(id, **kwargs)
File "/home/james/anaconda3/envs/seldonian_library_env/lib/python3.8/site-packages/gym/envs/registration.py", line 154, in register
raise error.Error('Cannot re-register id: {}'.format(id))
gym.error.Error: Cannot re-register id: simglucose-adolescent2-v0

我运行的是Ubuntu 18.04.6和Python 3.8.13。

更新:

问题在于";扩散";;它现在也出现在其他目录中,但不是所有目录。此外,当我更改代码以尝试在注册之前注销环境时,如下所示,我会收到以下新错误:

修改代码:

import gym
env_dict = gym.envs.registration.registry.env_specs.copy()
for env in env_dict:
if 'simglucose' in env:
print(f"Removing {env}")
del gym.envs.registration.registry.env_specs[env]
from gym.envs.registration import register
register(
id='simglucose-adolescent2-v0',
entry_point='simglucose.envs:T1DSimEnv',
kwargs={'patient_name': 'adolescent#002'}
)
env = gym.make('simglucose-adolescent2-v0')

新错误:

ModuleNotFoundError: No module named 'simglucose.envs'; 'simglucose' is not a package

奇怪的是,当我在没有发生上述第一个错误的目录中运行这个修改后的代码时(仍然使用相同的pip/conda环境(,这个新错误也没有发生。我检查了隐藏文件,在__pychache__目录中没有发现其他文件。我试着删除它,但它什么也没改变。

import simglucose

运行良好,但

import simglucose.envs #gym was calling pkg_resources which was calling this statement

失败(取决于目录(,因为我的Python文件名为simglucose.py。重命名文件解决了问题

不知怎的,这不仅导致了上面更新中的错误,还导致了最初的Cannot re-register id错误。重命名Python文件后不再出现错误(无需像我在更新中那样注销环境(。

TLDR:如果遇到这样的错误,请确保Python文件名与任何模块/包名称都不冲突

更新:我还发现了一个案例,其中注销步骤(归功于https://stackoverflow.com/a/61648353/3187892)并且这两个修复都是必需的,所以如果两者都不起作用,请同时尝试。

最新更新