[英]#!/usr/bin/python and #!/usr/bin/env python, which support?
Python腳本的shebang應該怎么樣?
有些人支持#!/usr/bin/env python
因為它可以智能地找到Python解釋器。 其他人支持#!/usr/bin/python
,因為現在在大多數GNU / Linux發行版中, python
是默認程序。
這兩種變體有什么好處?
Python解釋器的首選規范是
/usr/bin/python
或/usr/bin/pythonX.Y
。 這確保了使用了python的Debian安裝,並且滿足了對其他python模塊的所有依賴性。維護者不應使用
/usr/bin/env python
或/usr/bin/env pythonX.Y
覆蓋Debian Python解釋器。 這是不可取的,因為它繞過Debian的依賴性檢查並使包易受python的不完整本地安裝的影響。
請注意,Debian / Ubuntu使用替代系統來管理/usr/bin/python
實際指向的版本。 至少對我來說,這已經在很多python版本中運行得很好(我現在一直在使用2.3到2.7的python),並且在更新過程中有很好的轉換。
請注意, 我從未使用過pip
。 我想要自動安全升級,所以我通過aptitude
安裝我所有的python需求。 使用官方Debian / Ubuntu軟件包讓我的系統比我自己搞亂python安裝更清潔 。
讓我強調一件事。 上面的建議是指python應用程序的系統安裝。 讓這些使用python的系統管理版本是完全合理的。 如果您實際上正在玩自己的, 不是由操作系統管理的自定義python安裝,使用env
變體可能是說“使用用戶首選的python”的正確方式,而不是硬編碼系統python安裝(可能是/usr/bin/python
)或任何用戶自定義路徑。
env python
將導致程序的行為不同。 這可能是期望的 (例如,您正在編寫腳本以僅在您的virtualenv中工作)。 它可能會有問題 (你為你編寫一個工具,並期望它甚至在virtualenv中工作相同 - 它可能會突然失敗,因為它丟失了包)。
我的拙見是你應該使用env
-variant。 它是一個POSIX組件,因此幾乎在每個系統中都可以找到,而在很多情況下直接指定/usr/bin/python
中斷,即virtualenv設置。
我用#!/usr/bin/env python
作為默認的OS-X的安裝位置是不是 /usr/bin
。 這也適用於喜歡自定義環境的用戶 - /usr/local/bin
是另一個可以找到python發行版的常見位置。
也就是說,這真的無關緊要。 你總是可以用你想要的任何python版本來測試腳本: /usr/bin/strange/path/python myscript.py
。 此外,當您通過setuptools安裝腳本時,shebang似乎被安裝該腳本的sys.executable
所取代 - 我不知道pip
,但我認為它的行為類似。
如你所知,他們可能都在Linux上工作。 但是,如果某人安裝了較新版本的python供自己使用,或者某些要求使人們在/ usr / bin中保留特定版本,則env允許調用者設置其環境,以便通過其調用不同的版本ENV。
想象一下有人試圖看看python 3是否適用於腳本。 他們將首先在路徑中添加python3解釋器,但希望保持系統上的默認值在2.x上運行。 使用硬編碼路徑是不可能的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.