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


免責聲明!

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



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