Pythonスクリプトを直接実行する

Pythonスクリプトを直接実行する

私は時々Pythonスクリプトが直接実行されず、/foo/bar.pyシェルスクリプトで実行されることがわかりました。/usr/bin/python -O /foo/bar.py $@

ネットワーク管理者はそのような例の1つですwicd/usr/bin/wicd-gtk以下を開始するシェルスクリプトです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直接実行すると(実行可能であれば)どのような違いがありますか?

答え1

(以下内容は純粋な推測です。)

あなたが持っているのはWicdのパッケージバージョンであり、パッケージマネージャはディストリビューションのPythonパッケージバージョンを使ってそれをテストしました。しかし、/usr/share/wicd/gtk/wicd-client.py次のコードを使用して書かれています。

#!/usr/bin/env python

/usr/bin/env特にPythonプログラミングを行う場合、状況は異なる場合があります。パッケージャでは、Wicd が別の Python バージョンで実行されたり、異なるバージョンのライブラリを使用して発生する問題の可能性を減らすために、これを回避できます。python/usr/bin/python

彼らが作りたい他の準備があるかもしれません。wicd-gtkUbuntu 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 $@

答え2

スクリプト全体を公開していません。スクリプトは実行される前に他のタスクを実行します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を実行してバイトコードを最適化します。これは何が役に立つのかわかりません。

ラッパースクリプトもforceですが、/usr/bin/python/usr/share/wicd/gtk/wicd-client.py始まるので、コマンド検索パスに表示される最初のスクリプトを#!/usr/bin/env python選択します。pythonほとんどのシステムには何の影響もありません。

このスクリプトにはバグがあります。バグが$@必要です"$@"。パラメータにスペースまたはワイルドカードが含まれていると、ラッパースクリプトは失敗します\[*?

/usr/share/wicd/gtk/wicd-client.py存在する限り、手動~/.wicdで安全に実行できます。ただし、Debian パッケージは実行可能にしません。おそらく他のディストリビューションでも可能です。

関連情報