Python 스크립트 헤더


79

일반적인 헤더는

#!/usr/bin/env python

하지만 아래 스크립트를 실행할 때도 작동한다는 것을 알았습니다. $python ./my_script.py

#!/usr/bin/python
#!python

이 두 헤더의 차이점은 무엇입니까? 두 번째 문제는 무엇일까요? 파이썬 인터프리터가 PATH에 있는지 여부에 대해서도 논의하십시오. 감사.


3
헤더가 오두막이라고 그 en.wikipedia.org/wiki/Shebang_%28Unix%29
systempuntoout

4
참고로 스크립트 $ python ./my_script.pypython명시 적 으로 지정 하는 방식으로 실행 하면 shebang ( #!) 줄이 무시됩니다. 스크립트를 실행 파일로 실행하는 경우에만 효과가 있습니다 (예 : $ ./my_script.py.
David Z

@David Zaslavsky : +1 좋은 캐치.
Mark Byers

답변:


103

먼저 인터프리터를 사용하여 명시 적으로 스크립트를 실행할 때마다

$ python ./my_script.py
$ ksh ~/bin/redouble.sh
$ lua5.1 /usr/local/bin/osbf3

#!라인은 항상 무시됩니다. #!라인의 유닉스 기능입니다 실행 스크립트 만, 당신은이에 전체에 설명 볼 수 있습니다 에 대한 man 페이지execve(2) . 다음 단어 #!는 유효한 실행 파일의 경로 이름이어야합니다. 그래서

#!/usr/bin/env python

python사용자에있는 모든 것을 실행 합니다 $PATH. 이 형식은 이동되는 Python 인터프리터에 탄력적이므로 다소 이식성이 높지만 사용자가 .NET Framework에 추가하여 표준 Python 인터프리터를 재정의 할 수 있습니다 $PATH. 목표에 따라이 동작은 정상일 수도 있고 그렇지 않을 수도 있습니다.

다음,

#!/usr/bin/python

파이썬 인터프리터가 /usr/bin. 다른 곳에 설치하면 잃게됩니다. 그러나 이것은 당신이 원하는 버전을 정확히 얻거나 아무것도 얻지 못하도록하는 좋은 방법입니다 ( "fail-stop"동작).

#!/usr/bin/python2.5

드디어,

#!python

python스크립트가 실행될 때 현재 디렉토리에 실행 파일 이있는 경우에만 작동 합니다. 권장하지 않습니다.


28


스크립트 시작 부분에 3 가지를 제안합니다.

첫째, 이미 말했듯이 사용 환경 :

#!/usr/bin/env python

둘째, 인코딩을 설정하십시오.

# -*- coding: utf-8 -*-

셋째, 문서 문자열을 설정합니다.

"""This is a awesome
    python script!"""

그리고 확실히 나는 " "ident에 (4 공백)을 사용할 것 입니다.
최종 헤더는 다음과 같습니다.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""This is a awesome
        python script!"""


최고의 소원과 행복한 코딩.


탭보다 공백에 대한 겉보기 의견을 뒷받침하기 위해 : "공백이 선호되는 들여 쓰기 방법입니다." ( python.org/dev/peps/pep-0008/#tabs-or-spaces )
deepelement

5

Python 실행 파일은 / usr / bin이 아닌 다른 위치에 설치 될 수 있지만 env거의 항상 해당 위치에 있으므로 사용 /usr/bin/env이 더 이식 가능합니다.


2

env(GNU coreutils 6.10) 맨 페이지에서 :

env - run a program in a modified environment

이론적으로 env는 환경을 재설정 (기존 환경 변수의 대부분 제거)하거나 스크립트 헤더에 추가 환경 변수를 추가 하는 데 사용할 수 있습니다 . 실제로 언급 한 두 버전은 동일합니다. (다른 사람들이 좋은 점을 언급했지만 python통과를 지정 env하면 python경로를 몰라도 추상적으로 지정할 수 있습니다 .)


1

예, 있습니다-파이썬은에 없을 수 /usr/bin있지만 예를 들어 /usr/local/bin(BSD)에 있습니다.

virtualenv를 사용할 때 다음과 같을 수도 있습니다. ~/projects/env/bin/python


0

/usr/bin/env python스크립트 예에 의존 스크립트를 사용하기위한 환경 설정에 따라 달라 때 매우 유용하게된다 python virtualenv. 각 virtualenv에는 PYTHONPATH env를 건드리지 않고 virtualenv에 설치된 패키지를 Python 경로에 추가하는 데 필요한 자체 버전의 Python 바이너리가 있습니다.

점점 더 많은 사람들이 파이썬 개발을 위해 virtualenv를 사용하기 시작함에 따라 사람들이 커스텀 파이썬 바이너리를 사용하는 것을 원하지 않는 한 사용을 선호합니다 /usr/bin/env python.

참고 : 사용자가 사용자 정의 환경에서 스크립트를 실행하도록 허용하면 잠재적 인 보안 문제 (다중 사용자 환경에서)가 있음을 이해해야합니다. 여기 에서 몇 가지 아이디어를 얻을 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.