Python3.7虚拟环境pip安装aiohttp触发AttributeError:_dep_map错误
我正尝试在Python 3.7虚拟环境中安装aiohttp,但在安装yarl依赖时触发了AttributeError: _dep_map异常。执行pip install aiohttp后,安装流程在处理yarl-1.3.0.tar.gz时失败,报错信息为AttributeError: _dep_map。我已查询aiohttp和yarl的GitHub相关问题但无收获,也尝试安装yarl的1.0、1.1、1.2旧版本,均未解决问题。请问该错误的成因可能是什么?
相关命令输出如下:
$ pip install aiohttp Collecting aiohttp Using cached https://files.pythonhosted.org/packages/33/60/c21acb7002110699761d3dec36fad3f5087c2752a4eb495444f877db6553/aiohttp-3.5.4-cp37-cp37m-manylinux1_x86_64.whl Collecting multidict<5.0,>=4.0 (from aiohttp) Downloading https://files.pythonhosted.org/packages/88/f0/4d4cbd1a3744e3985efa49682352d0703df653ffa76b81f10fed86599a50/multidict-4.5.2-cp37-cp37m-manylinux1_x86_64.whl (309kB) 100% |████████████████████████████████| 317kB 65.0MB/s Collecting attrs>=17.3.0 (from aiohttp) Using cached https://files.pythonhosted.org/packages/3a/e1/5f9023cc983f1a628a8c2fd051ad19e76ff7b142a0faf329336f9a62a514/attrs-18.2.0-py2.py3-none-any.whl Requirement already satisfied: async-timeout<4.0,>=3.0 in /fast/src/mobitroll/merlin/tools/ws/.py37/lib/python3.7/site-packages (from aiohttp) (3.0.1) Requirement already satisfied: chardet<4.0,>=2.0 in /fast/src/mobitroll/merlin/tools/ws/.py37/lib/python3.7/site-packages (from aiohttp) (3.0.4) Collecting yarl<2.0,>=1.0 (from aiohttp) Downloading https://files.pythonhosted.org/packages/fb/84/6d82f6be218c50b547aa29d0315e430cf8a23c52064c92d0a8377d7b7357/yarl-1.3.0.tar.gz (159kB) 100% |████████████████████████████████| 163kB 87.1MB/s Complete output from command python setup.py egg_info: Traceback (most recent call last): File "<string>", line 1, in <module> File "/tmp/pip-install-od3qiiy3/yarl/setup.py", line 102, in <module> setup(**args) File "/fast/src/mobitroll/merlin/tools/ws/.py37/lib/python3.7/site-packages/setuptools/__init__.py", line 142, in setup _install_setup_requires(attrs) File "/fast/src/mobitroll/merlin/tools/ws/.py37/lib/python3.7/site-packages/setuptools/__init__.py", line 131, in _install_setup_requires (k, v) for k, v in attrs.items() File "/fast/src/mobitroll/merlin/tools/ws/.py37/lib/python3.7/site-packages/setuptools/dist.py", line 442, in __init__ k: v for k, v in attrs.items() File "/usr/lib/python3.7/distutils/dist.py", line 292, in __init__ self.finalize_options() File "/fast/src/mobitroll/merlin/tools/ws/.py37/lib/python3.7/site-packages/setuptools/dist.py", line 600, in finalize_options ep.require(installer=self.fetch_build_egg) File "/fast/src/mobitroll/merlin/tools/ws/.py37/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2367, in require reqs = self.dist.requires(self.extras) File "/fast/src/mobitroll/merlin/tools/ws/.py37/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2635, in requires dm = self._dep_map File "/fast/src/mobitroll/merlin/tools/ws/.py37/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2691, in __getattr__ raise AttributeError(attr) AttributeError: _dep_map ---------------------------------------- Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-od3qiiy3/yarl/
碰到这个AttributeError: _dep_map的报错,大概率是你的依赖管理工具(setuptools/pkg_resources)或者虚拟环境本身出了问题,结合你提供的报错栈信息,我整理了几个方向供你排查:
setuptools或pkg_resources版本不兼容/损坏
从报错轨迹能看到,错误发生在pkg_resources内部的依赖映射调用上,这通常是因为setuptools版本太旧,或者组件文件损坏导致的。你可以先尝试升级pip和setuptools到最新兼容版本:pip install --upgrade pip setuptools如果升级后问题依旧,不妨卸载重装setuptools试试:
pip uninstall -y setuptools pip install setuptools虚拟环境本身损坏
虚拟环境的文件可能因为某些原因(比如磁盘空间不足、意外中断安装)出现缺失或损坏,导致依赖管理组件无法正常工作。这种情况下,最简单的办法是创建一个全新的Python3.7虚拟环境,再尝试安装:# 用venv创建新环境 python3.7 -m venv fresh_py37_env source fresh_py37_env/bin/activate pip install aiohttp系统Python与虚拟环境的隔离性问题
有时候系统级的Python组件会“渗透”到虚拟环境中,导致版本冲突。如果用的是virtualenv工具,可以创建完全隔离的环境:virtualenv --no-site-packages -p python3.7 isolated_env source isolated_env/bin/activate pip install aiohttp尝试安装预编译的yarl wheel包
你之前尝试了yarl的旧版本,但都是源码包安装(从tar.gz可以看出来),或许直接安装预编译的wheel包能绕过egg_info阶段的问题。试试强制安装wheel版本:pip install yarl==1.3.0 --only-binary :all:如果这个命令成功,再安装aiohttp应该就没问题了。
内容的提问来源于stack exchange,提问作者Cosimo

