conda env export导出环境报AttributeError: module 'attr' has no attribute 's'
当前运行环境信息:
- 操作系统:Ubuntu 20.04.4,内核版本5.13.0-44-generic
- Conda版本:4.13.0
执行命令conda env export -n torch > torch.yml导出名为torch的conda虚拟环境时,触发如下AttributeError报错:
File "/home/onatgirit/anaconda3/bin/conda-env", line 6, in <module> from conda_env.cli.main import main File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/conda_env/cli/main.py", line 44, in <module> from . import main_create File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/conda_env/cli/main_create.py", line 20, in <module> from .. import specs File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/conda_env/specs/__init__.py", line 15, in <module> from .notebook import NotebookSpec File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/conda_env/specs/notebook.py", line 5, in <module> import nbformat File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/nbformat/__init__.py", line 11, in <module> from . import v1, v2, v3, v4 File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/nbformat/v4/__init__.py", line 39, in <module> from .convert import downgrade, upgrade File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/nbformat/v4/convert.py", line 13, in <module> from .. import validator File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/nbformat/validator.py", line 13, in <module> from .json_compat import ValidationError, _validator_for_name, get_current_validator File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/nbformat/json_compat.py", line 11, in <module> import jsonschema File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/jsonschema/__init__.py", line 12, in <module> from jsonschema._format import ( File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/jsonschema/_format.py", line 10, in <module> from jsonschema.exceptions import FormatError File "/home/onatgirit/anaconda3/lib/python3.8/site-packages/jsonschema/exceptions.py", line 158, in <module> @attr.s(hash=True) AttributeError: module 'attr' has no attribute 's'
后续尝试导出其他conda虚拟环境时均触发相同报错。
执行排查命令获取到如下信息:
- 执行
conda info输出:
shell level : 0 user config file : /home/onatgirit/.condarc populated config files : /home/onatgirit/.condarc conda version : 4.13.0 conda-build version : 3.20.5 python version : 3.8.13.final.0 virtual packages : __cuda=11.6=0 __linux=5.13.0=0 __glibc=2.31=0 __unix=0=0 __archspec=1=x86_64 base environment : /home/onatgirit/anaconda3 (writable) conda av data dir : /home/onatgirit/anaconda3/etc/conda conda av metadata url : None channel URLs : https://repo.anaconda.com/pkgs/main/linux-64 https://repo.anaconda.com/pkgs/main/noarch https://repo.anaconda.com/pkgs/r/linux-64 https://repo.anaconda.com/pkgs/r/noarch package cache : /home/onatgirit/anaconda3/pkgs /home/onatgirit/.conda/pkgs envs directories : /home/onatgirit/anaconda3/envs /home/onatgirit/.conda/envs platform : linux-64 user-agent : conda/4.13.0 requests/2.27.1 CPython/3.8.13 Linux/5.13.0-44-generic ubuntu/20.04.4 glibc/2.31 UID:GID : 1000:1000 netrc file : None offline mode : False
- 执行
conda list -n base '(nbformat|jsonschema|attr)'查看base环境相关依赖版本,输出如下:
# # Name Version Build Channel attrs 21.4.0 pyhd3eb1b0_0 jsonschema 4.4.0 py38h06a4308_0 nbformat 5.3.0 py38h06a4308_0 python-fastjsonschema 2.15.1 pyhd3eb1b0_0
base环境内安装的attrs 21.4.0版本本身是兼容的,不存在版本不匹配问题。
3. 执行conda run -n base python -c 'import attr; print(attr.__spec__)'检查attr模块加载路径,输出如下:
当前加载的attr模块来自用户本地目录下的独立文件,并非conda base环境内安装的attrs包。
Python导入模块时,用户目录下~/.local/lib/python3.8/site-packages/的搜索优先级高于conda环境的site-packages路径。本地残留的attr.py文件和正规attrs库的模块名重名,直接覆盖了conda环境内的正常attr模块,这个残留文件没有定义s属性,因此jsonschema调用@attr.s()装饰器时抛出属性错误。
之前尝试pip卸载、重装attrs包没有效果,是因为pip操作的是环境内安装的正规包,没有处理本地这个冲突的残留py文件。
- 处理冲突文件,直接重命名备份或者删除即可:
# 备份方案,避免误删需要的文件 mv /home/onatgirit/.local/lib/python3.8/site-packages/attr.py /home/onatgirit/.local/lib/python3.8/site-packages/attr.py.bak # 确认文件无用可以直接删除 # rm /home/onatgirit/.local/lib/python3.8/site-packages/attr.py
- 清理对应pyc缓存,避免缓存影响加载:
rm -rf /home/onatgirit/.local/lib/python3.8/site-packages/__pycache__/attr*
- 验证修复结果,执行命令检查attr模块加载路径:
conda run -n base python -c 'import attr; print(attr.__file__)'
如果输出路径指向/home/onatgirit/anaconda3/lib/python3.8/site-packages/attr/目录下的文件,说明模块加载恢复正常,此时再执行conda env export系列命令就不会再报相同错误。
内容的提问来源于stack exchange,提问作者Onat Girit

