如何修复Python3.10的importlib使其正常调用entry_points()?
Ubuntu 22.04 + Python 3.10导入gymnasium时entry points报错问题
环境与问题背景
- 系统:Ubuntu 22.04
- Python版本:3.10
- 依赖库:Farama Foundation的gymnasium
在IDLE中执行import gymnasium时触发报错,错误源于importlib获取entry points的过程中出现格式问题,具体报错信息如下:
Traceback (most recent call last): File "/usr/lib/python3.10/idlelib/run.py", line 578, in runcode exec(code, self.locals) File "<pyshell#2>", line 1, in <module> File "/usr/local/lib/python3.10/dist-packages/gymnasium/__init__.py", line 12, in <module> from gymnasium.envs.registration import ( File "/usr/local/lib/python3.10/dist-packages/gymnasium/envs/__init__.py", line 382, in <module> load_plugin_envs() File "/usr/local/lib/python3.10/dist-packages/gymnasium/envs/registration.py", line 565, in load_plugin_envs for plugin in metadata.entry_points(group=entry_point): File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 1009, in entry_points return SelectableGroups.load(eps).select(**params) File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 459, in load ordered = sorted(eps, key=by_group) File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 1006, in <genexpr> eps = itertools.chain.from_iterable( File "/usr/lib/python3.10/importlib/metadata/_itertools.py", line 16, in unique_everseen k = key(element) File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 941, in _normalized_name return self._name_from_stem(stem) or super()._normalized_name File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 622, in _normalized_name return Prepared.normalize(self.name) File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 871, in normalize return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_') File "/usr/lib/python3.10/re.py", line 209, in sub return _compile(pattern, flags).sub(repl, string, count) TypeError: expected string or bytes-like object
尝试的排查操作
咨询gymnasium开发者后,执行以下代码尝试打印entry points列表:
from importlib.metadata import * eps = entry_points()
但仍然触发完全相同的报错:
Traceback (most recent call last): File "/usr/lib/python3.10/idlelib/run.py", line 578, in runcode exec(code, self.locals) File "<pyshell#1>", line 1, in <module> File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 1009, in entry_points return SelectableGroups.load(eps).select(**params) File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 459, in load ordered = sorted(eps, key=by_group) File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 1006, in <genexpr> eps = itertools.chain.from_iterable( File "/usr/lib/python3.10/importlib/metadata/_itertools.py", line 16, in unique_everseen k = key(element) File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 941, in _normalized_name return self._name_from_stem(stem) or super()._normalized_name File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 622, in _normalized_name return Prepared.normalize(self.name) File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 871, in normalize return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_') File "/usr/lib/python3.10/re.py", line 209, in sub return _compile(pattern, flags).sub(repl, string, count) TypeError: expected string or bytes-like object
需求
推测是某个已安装包的entry point名称格式不符合要求,但不知道如何定位并修复该问题。可以接受重装Python 3.10及所有依赖包,但更希望找到更温和的解决办法。
内容的提问来源于stack exchange,提问作者DarthMalloc
相关产品推荐
相关产品推荐

