Shell-Script

直接執行python腳本

  • September 13, 2015

我注意到有時 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 $@

引用自:https://unix.stackexchange.com/questions/229340