Conda虛擬環境嵌套導致的一系列路徑問題


最近在linux上是用conda虛擬環境出現很多問題。

比如使用conda activate py3.7激活環境后發現python搜索路徑依然是默認路徑:

In [1]: import sys                                                                                                                                                           

In [2]: sys.path                                                                                                                                                             
Out[2]: 
['/home/sherry/anaconda3/bin',
 '/home/sherry',
 '/home/sherry/git/models/research',
 '/home/sherry/git/models/research/slim',
 '/home/sherry/anaconda3/lib/python37.zip',
 '/home/sherry/anaconda3/lib/python3.7',
 '/home/sherry/anaconda3/lib/python3.7/lib-dynload',
 '',
 '/home/sherry/.local/lib/python3.7/site-packages',
 '/home/sherry/anaconda3/lib/python3.7/site-packages',
 '/home/sherry/anaconda3/lib/python3.7/site-packages/IPython/extensions',
 '/home/sherry/.ipython']

同時pip的安裝路徑也不太對,問題同這篇文章,但是后來里面的方法也失效了,不得不在.bashrc.sh里用alias指定 pip path

(py3.7) sherry@lambda-1:~$ which pip
/home/sherry/anaconda3/envs/py3.7/bin/pip
(py3.7) sherry@lambda-1:~$ type pip
pip is /home/sherry/anaconda3/bin/pip
alias pip=/home/sherry/anaconda3/envs/py3.7/bin/pip

 

參考這篇文章之后發現,問題可能在於環境嵌套。

每次登陸進linux系統后默認進入base環境,再用conda activate激活虛擬環境,會導致發生環境嵌套,具體可以通過conda info中的shell level參數查看:

(py3.7) sherry@lambda-1:~$ conda info

     active environment : py3.7
    active env location : /home/sherry/anaconda3/envs/py3.7
            shell level : 2
       user config file : /home/sherry/.condarc
 populated config files : 
          conda version : 4.8.3
    conda-build version : 3.18.11
         python version : 3.7.7.final.0
       virtual packages : __cuda=11.0
                          __glibc=2.27
       base environment : /home/sherry/anaconda3  (writable)
           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/sherry/anaconda3/pkgs
                          /home/sherry/.conda/pkgs
       envs directories : /home/sherry/anaconda3/envs
                          /home/sherry/.conda/envs
               platform : linux-64
             user-agent : conda/4.8.3 requests/2.23.0 CPython/3.7.7 Linux/5.4.0-42-generic ubuntu/18.04.3 glibc/2.27
                UID:GID : 1004:1022
             netrc file : None
           offline mode : False

這里shell level是2說明發生嵌套,關於嵌套的更多說明如下:

當已經激活某個環境時,再次 conda activate envname 將發生環境嵌套,而不是切換。

多個環境嵌套時,軟件包可能產生異常行為。

Python 需格外小心!若最內層環境沒有安裝 Python,所有與 Python 有關的程序(尤其是 pip )將逐層向外 fallback 直至 base,很容易造成污染。

可通過 conda info 的 shell level 來檢查嵌套情況。

如非特別必要,不建議使用環境嵌套。

默認允許 2 層環境嵌套,可通過 conda config --set max_shlvl number 調至更高或將該特性關閉。

解決方法先用conda deactivate退出base,再激活py3.7,python搜索路徑即可恢復正常。

(base) sherry@lambda-1:~$ conda deactivate
sherry@lambda-1:~$ conda activate py3.7
(py3.7) sherry@lambda-1:~$ which pip
/home/sherry/anaconda3/envs/py3.7/bin/pip
(py3.7) sherry@lambda-1:~$ type pip
pip is /home/sherry/anaconda3/envs/py3.7/bin/pip
(py3.7) sherry@lambda-1:~$ conda info

     active environment : py3.7
    active env location : /home/sherry/anaconda3/envs/py3.7
            shell level : 1
       user config file : /home/sherry/.condarc
 populated config files : 
          conda version : 4.8.3
    conda-build version : 3.18.11
         python version : 3.7.7.final.0
       virtual packages : __cuda=11.0
                          __glibc=2.27
       base environment : /home/sherry/anaconda3  (writable)
           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/sherry/anaconda3/pkgs
                          /home/sherry/.conda/pkgs
       envs directories : /home/sherry/anaconda3/envs
                          /home/sherry/.conda/envs
               platform : linux-64
             user-agent : conda/4.8.3 requests/2.23.0 CPython/3.7.7 Linux/5.4.0-42-generic ubuntu/18.04.3 glibc/2.27
                UID:GID : 1004:1022
             netrc file : None
           offline mode : False
In [1]: import sys                                                                                                                                                           

In [2]: sys.path                                                                                                                                                             
Out[2]: 
['/home/sherry/anaconda3/envs/py3.7/bin',
 '/home/sherry',
 '/home/sherry/git/models/research',
 '/home/sherry/git/models/research/slim',
 '/home/sherry/anaconda3/envs/py3.7/lib/python37.zip',
 '/home/sherry/anaconda3/envs/py3.7/lib/python3.7',
 '/home/sherry/anaconda3/envs/py3.7/lib/python3.7/lib-dynload',
 '',
 '/home/sherry/.local/lib/python3.7/site-packages',
 '/home/sherry/anaconda3/envs/py3.7/lib/python3.7/site-packages',
 '/home/sherry/anaconda3/envs/py3.7/lib/python3.7/site-packages/IPython/extensions',
 '/home/sherry/.ipython']

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM