最近在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']
