1. 程式人生 > 實用技巧 >python和sudo python的區別

python和sudo python的區別

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

https://www.jianshu.com/p/c419abc73955

https://blog.csdn.net/qq_16568205/article/details/98976693