Python 스크립트를 직접 실행

Python 스크립트를 직접 실행

나는 때때로 Python 스크립트가 직접 실행되지 않고 /foo/bar.py쉘 스크립트에서 실행되는 것을 발견했습니다./usr/bin/python -O /foo/bar.py $@

네트워크 관리자가 그러한 예 중 하나입니다 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수동으로 안전하게 실행할 수 있습니다. 그러나 데비안 패키지는 실행 가능하게 만들지 않습니다. 아마도 다른 배포판에서도 가능합니다.

관련 정보