添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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