1.問題
ubuntu16.04自帶了python2.7,工作需要安裝了其他版本的python(anaconda,python3.5)。
使用中,遇到輸入python test.py時可以正常運行,但是sudo python test.py時出現包導入錯誤:
ImportError: No module named xxx
2.分析
(1)由於python import的模塊路徑存在與sys.path中,在腳本中報ImportError之前,加入打印:
import sys print(sys.path)
輸入 sudo python test.py:
['/home/yhb/share', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', ......]
輸入 python test.py:
['/home/yhb/share', '/home/yhb/detvm/python', ......, '/home/yhb/anaconda3/lib/python35.zip', '/home/yhb/anaconda3/lib/python3.5',......]
明顯,從第二項開始,import的module的順序不一致了,而且python版本也不一致了。
(2)在terminal直接輸入sudo python和python,會發現python的版本確實是不一樣的:
輸入sudo python時:
輸入python時:
3.解決問題
(1)解決2(1)中的導入順序問題
雖然anaconda安裝完成后,在~/.bashrc中也設置了 PYTHONPATH和PATH的環境變量,為什么還會在sudo python test.py時出現包導入錯誤,而在使用python test.py時又是正常的呢?這是因為在使用sudo模式執行程序的時候,系統會自動重置PATH環境變量。
(a)$ sudo gedit /etc/sudoers 打開文件,會發現如下這行,表示sudo模式下會默認重置環境變量。
Defaults env_reset
(b)修改 /etc/sudoers,使sudo下可以繼續使用我們定義的環境變量:
# Defaults env_reset Defaults env_keep += "PATH" Defaults env_keep += "PYTHONPATH" # 其他用戶定義的環境變量
修改完后,重新輸入sudo python test.py和python test.py,會發現兩者的包導入順序一致了!
(2)解決2(2)中python版本使用問題,可以用重建到anaconda版本python的軟連接方式解決:
sudo cp /usr/bin/python /usr/bin/python_bak
sudo rm /usr/bin/python
sudo ln -s /home/yhb/anaconda3/bin/python3.5 /usr/bin/python
修改完成后再輸入sudo python可以看到當前使用的是anaconda中的python3.5
參考:
https://blog.csdn.net/wuliangcai_/article/details/86660009