1. 程式人生 > 其它 >Conda 建立 Python 虛擬環境不純淨的問題(2021.1.18)

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