Conda 创建 Python 虚拟环境不纯净的问题(2021.1.18)
Conda 创建 Python 虚拟环境不纯净的问题(2021.1.18)
1. 产生环境
- Ubuntu 16.04;
- Conda 4.9.2;
- Python 3.6;
2. 问题描述
通过 Conda 命令创建 Python 虚拟环境后,利用 pip list
命令查看包列表,发现有很多多余的包,并不是一个干净的虚拟环境。问题出现的具体操作如下:
# 创建 Python 虚拟环境
$ conda create -n env python=3.6
# 激活 Python 虚拟环境
$ conda activate env
# 查看包列表
$ pip list
Package Version
--------------- -------------------
autopep8 1.5.4
certifi 2020.12.5
cycler 0.10.0
kiwisolver 1.3.1
matplotlib 3.3.3
Pillow 8.0.1
pip 20.3.3
pycodestyle 2.6.0
python-dateutil 2.8.1
scipy 1.5.4
setuptools 51.1.2.post20210112
toml 0.10.2
wheel 0.36.2
3. 原因分析
经过调研发现并不是 Conda 创建的 Python 虚拟环境不纯净,而是 Pip 列出了用户安装的包。可以通过如下命令进行查看:
# 查看 sys.path,确认 pip 列出包的来源
$ python -m site
sys.path = [
'/data/xxx',
'/data/xxx/.anaconda3/envs/env/lib/python36.zip',
'/data/xxx/.anaconda3/envs/env/lib/python3.6',
'/data/xxx/.anaconda3/envs/env/lib/python3.6/lib-dynload',
'/data/xxx/.local/lib/python3.6/site-packages',
'/data/xxx/.anaconda3/envs/env/lib/python3.6/site-packages',
]
USER_BASE: '/data/xxx/.local' (exists)
USER_SITE: '/data/xxx/.local/lib/python3.6/site-packages' (exists)
ENABLE_USER_SITE: True
可以看到 ENABLE_USER_SITE
的值为 True
,且 USER_SITE
的路径为 /data/xxx/.local/lib/python3.6/site-packages
,查看该路径后发现 pip list
列出的包确实是该目录下的。
4. 解决方法
了解了问题出现的原因,那我们只需要把 ENABLE_USER_SITE
的值设置为 FALSE
即可。具体的操作过程如下:
# 查看 site.py 的位置
$ python -m site --help
/data/xxx/.anaconda3/envs/env/lib/python3.6/site.py [--user-base] [--user-site]
Without arguments print some useful information
With arguments print the value of USER_BASE and/or USER_SITE separated
by ':'.
Exit codes with --user-base or --user-site:
0 - user site directory is enabled
1 - user site directory is disabled by user
2 - uses site directory is disabled by super user
or for security reasons
>2 - unknown error
# 可以看到 site.py 的位置为 /data/xxx/.anaconda3/envs/env/lib/python3.6/site.py
# 编辑该文件,找到 ENABLE_USER_SITE 并将其设置为 False
$ vim /data/xxx/.anaconda3/envs/env/lib/python3.6/site.py
# 再次查看 sys.path 的路径,发现 ENABLE_USER_SITE 的值已经变为了 False
$ python -m site
sys.path = [
'/data/xxx',
'/data/xxx/.anaconda3/envs/env/lib/python36.zip',
'/data/xxx/.anaconda3/envs/env/lib/python3.6',
'/data/xxx/.anaconda3/envs/env/lib/python3.6/lib-dynload',
'/data/xxx/.anaconda3/envs/env/lib/python3.6/site-packages',
]
USER_BASE: '/data/xxx/.local' (exists)
USER_SITE: '/data/xxx/.local/lib/python3.6/site-packages' (exists)
ENABLE_USER_SITE: False
# 再次查看 pip list 包列表,已经没了多余的包
$ pip list
Package Version
---------- -------------------
certifi 2020.12.5
pip 20.3.3
setuptools 51.1.2.post20210112
wheel 0.36.2