直接執行python腳本
我注意到有時 python 腳本不是直接啟動的,即
/foo/bar.py
,而是從一個 shell 腳本啟動的,它除了/usr/bin/python -O /foo/bar.py $@
一個這樣的例子是
wicd
網路管理器。/usr/bin/wicd-gtk
是一個 shell 腳本,它啟動wicd-client.py
:$ cat /usr/bin/wicd-gtk exec /usr/bin/python -O /usr/share/wicd/gtk/wicd-client.py $@
這個額外步驟的目的是什麼?
如果我
/usr/share/wicd/gtk/wicd-client.py
直接開始(如果它是可執行的)會有什麼區別?
你沒有發布完整的腳本——腳本在執行之前做了其他事情
wicd-client.py
。它首先確保存在某個目錄和某個符號連結:# check_firstrun() if [ ! -d "$HOME/.wicd" ]; then mkdir -p "$HOME/.wicd" fi # Make sure the user knows WHEREAREMYFILES ;-) if [ -e "/var/lib/wicd/WHEREAREMYFILES" ] && [ ! -L "$HOME/.wicd/WHEREAREMYFILES" ]; then ln -s "/var/lib/wicd/WHEREAREMYFILES" "$HOME/.wicd/WHEREAREMYFILES" fi
然後它使用該
-O
選項執行 Python,這會導致它優化字節碼。我不知道這有多大用處。包裝器腳本也強制
/usr/bin/python
使用,而/usr/share/wicd/gtk/wicd-client.py
以 開頭#!/usr/bin/env python
,因此它會選擇python
命令搜尋路徑中先出現的那個。在大多數係統上,這不會有任何區別。請注意,此腳本中有一個錯誤:
$@
應該是"$@"
. 如果任何參數包含空格或萬用字元,包裝腳本將失敗\[*?
。
/usr/share/wicd/gtk/wicd-client.py
只要~/.wicd
存在,您就可以安全地手動執行。但是,Debian 軟體包並沒有使其可執行;也許其他發行版可以。
(以下純屬猜測。)
您所擁有的是一個打包版本的 Wicd,並且包維護者已經使用發行版打包的 Python 版本對其進行了測試。然而,
/usr/share/wicd/gtk/wicd-client.py
是用這個shebang寫的:#!/usr/bin/env python
很可能會出現與
/usr/bin/env
不同的python
情況/usr/bin/python
,尤其是在您進行任何 Python 程式時。打包程序可能希望避免這種情況,如果只是為了減少由於 Wicd 在不同 Python 版本下執行或使用不同版本的庫而出現問題的機會。他們可能還想做其他準備工作。
wicd-gtk
在 Ubuntu 14.04 上有這個/usr/bin/wicd-gtk
:#!/bin/sh # check_firstrun() if [ ! -d "$HOME/.wicd" ]; then mkdir -p "$HOME/.wicd" fi # Make sure the user knows WHEREAREMYFILES ;-) if [ -e "/var/lib/wicd/WHEREAREMYFILES" ] && [ ! -L "$HOME/.wicd/WHEREAREMYFILES" ]; then ln -s "/var/lib/wicd/WHEREAREMYFILES" "$HOME/.wicd/WHEREAREMYFILES" fi exec /usr/bin/python -O /usr/share/wicd/gtk/wicd-client.py $@