Conda 创建 Python 虚拟环境不纯净的问题(2021.1.18)


Conda 创建 Python 虚拟环境不纯净的问题(2021.1.18)

目录
  • Conda 创建 Python 虚拟环境不纯净的问题(2021.1.18)
    • 1. 产生环境
    • 2. 问题描述
    • 3. 原因分析
    • 4. 解决方法

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