#을 넣어야합니까! (shebang) Python 스크립트에서 어떤 형식을 사용해야합니까?


828

Shebang을 Python 스크립트에 넣어야합니까? 어떤 형태로?

#!/usr/bin/env python 

또는

#!/usr/local/bin/python

이것들은 이식성이 있습니까? 어떤 형태가 가장 많이 사용됩니까?

참고 : 토네이도 프로젝트는 오두막을 사용합니다. 반면에 Django 프로젝트는 그렇지 않습니다.


70
두 번째는 휴대하지 않고 것 , 많은 컴퓨터에이 아니라면 대부분 실패합니다.
— Dietrich Epp

4
어떻게 #!/usr/bin/python첫 번째 옵션 비교? 나는 이것을 많은 예제 코드에서 볼 수 있습니다. 편집 : 아마 이것이 답입니다 .. stackoverflow.com/a/2429517/1156245
— geotheory


1
나는 항상 그것을 사용한다고 왜? "Zen Of Python"-2 행- "명시 성이 암시 적보다 낫습니다." python.org/dev/peps/pep-0020
— JayRizzo

2
솔직히 말해서, "올바른"것도 아닙니다. 저자는 스크립트가 실행될 때 올바른 버전의 Python이 어디에 있는지 알지 못하기 때문입니다. 올바른 shebang을 추가하는 것은 설치 프로그램 의 작업이어야합니다 .
— chepner 2016 년

답변:


1117

스크립트의 shebang 행 python은 터미널에 미리 입력하지 않거나 파일 관리자에서 스크립트를 두 번 클릭 할 때 (올바로 구성된 경우) 독립 실행 형 실행 파일처럼 스크립트를 실행할 수있는 능력을 결정합니다 . 반드시 필요한 것은 아니지만 일반적으로 편집기에서 파일을 연 사람이보고있는 것을 즉시 알 수 있습니다. 그러나, 당신이 사용하는 오두막 라인 입니다 중요합니다.

Python 3 스크립트의 올바른 사용법은 다음과 같습니다.

#!/usr/bin/env python3

기본값은 3.latest입니다. Python 2.7.latest python2대신에 사용하십시오 python3.

다음 은 사용하지 않아야합니다 (Python 2.x 및 3.x와 호환되는 코드를 작성하는 드문 경우 제외) :

#!/usr/bin/env python

에 주어진 이러한 권장 사항에 대한 이유, PEP 394 , 즉 python하려면 다음 중 하나를 참조 할 수 있습니다 python2또는 python3다른 시스템에. 현재 python2대부분의 배포판에서 언급 되지만 언젠가는 변경 될 수 있습니다.

또한 다음을 사용하지 마십시오 :

#!/usr/local/bin/python

"이 경우 / usr / bin / python 또는 / bin / python에 Python을 설치할 수 있습니다. 위의 #!는 실패합니다."

- "#! / usr / bin / env python"vs "#! / usr / local / bin / python"


4
@EliasVanOotegem 당신은 파이썬에서 찾을 수 있음을 확신 할 수없는 경우 /usr/bin당신이 확신 할 수있는 방법을 다음 env에서 찾을 수 /usr/bin. 파이썬이 비표준 위치에 설치되면 파이썬이 비표준 방식으로 설정되고 결과적으로 스크립트가 빠르게 실패해야 함을 의미합니다. 파이썬 인터프리터의 속성에 대한 가정을하고 최선을 다하는 것과는 반대로.
— 모래 언덕

65
@Dunes : env는 항상 에서 찾을 수 /usr/bin/있으며 그 작업은을 사용하여 bin (예 : python)을 찾는 것 PATH입니다. 파이썬 설치 방법에 관계없이 경로가이 변수에 추가되고 env찾을 수 있습니다 (그렇지 않으면 파이썬이 설치되지 않음). 즉의 작업의 env전체이다, 이유 가 존재하는 이유. 환경을 경고하는 것입니다 (설치 경로를 포함하여 env 변수 설정 및 경로 포함). 사람들은 항상이 명령이 항상 같은 장소에있는 경우에만 작동한다는 것을 알고 있습니다. 그것은 단지 주어진 것입니다
— Elias Van Ootegem

3
@JFSebastian : 맞습니다. POSIX 표준에 의해 보장되거나 적용되지는 않습니다. 최신 IEEE 버전 중 하나에 환경 관련 내용이 포함되어 있다고 가정했습니다. 어느 쪽이든 : 아니, /usr/bin/env(보편적?) 널리 이외의 어떤 표준에 의해 보장되지 채택 규칙 ...
— 엘리아스 반 Ootegem

6
virtualenv를 사용하는 경우 #! / usr / local / bin / python (존재하더라도)이 잘못됩니다.
— nullas

6
이 하나의 문제 :에 따라 PEP394 에만 사용해야 하나의 python스크립트 파이썬 2, 그렇지 않으면 파이썬 3와 호환 때 실행, 그것은 적절한에서 선택을 가리켜 야 python2하고 python3.
— amiller27

67

정말 맛의 문제 일뿐입니다. shebang을 추가하면 사람들이 원하는 경우 스크립트를 직접 호출 할 수 있습니다 (실행 파일로 표시되어 있다고 가정). 생략하면 python수동으로 호출해야합니다.

프로그램 실행의 최종 결과는 어느 쪽에도 영향을 미치지 않습니다. 수단의 옵션 일뿐입니다.


3
그것은 "그냥"입니다. "올바른"면이 없기 때문에 어떤면을 취하는지는 중요하지 않습니다. 완전히 주관적인 결정입니다.
— Amber

5
다른 사소한 결정에 지나지 않습니다. en.wikipedia.org/wiki/Parkinson's_Law_of_Triviality
— Amber

2
'python'명령없이 어떻게 파이썬 파일을 직접 실행할 수 있습니까?
— Zen

5
@ 젠 스크립트에 shebang (#! / usr / bin / env python)을 포함 시켰다고 가정하면 스크립트를 실행 가능하게 만들어야합니다. 같은 chmod a+x [your-script].py것이 실행 가능해야 ./[your-script.py]하며 쉘을 호출하면 됩니다.
— skålfyfan

9
GlassGhost에 의해 답변이 지적 하듯이, 거기에 있다 맛 이외를 포함하는 구체적인 장점은 : 그들이 오히려 가져올 의미하는 것 파일보다는 실행 스크립트를 읽고있는 파일의 미래 리더 분명합니다. 공용 / 개인용 액세스 제어 수정자가있는 언어의 경우와 마찬가지로 Shebang은 실제 효과뿐만 아니라 문서화에 유용하며 일부 경우 문서화 측면이 실제로 가장 중요합니다.
— Mark Amery

32

Shebang을 Python 스크립트에 넣어야합니까?

shebang을 Python 스크립트에 넣어서 다음을 표시하십시오.

  • 이 모듈은 스크립트로 실행할 수 있습니다
  • python2, python3에서만 실행할 수 있는지 아니면 Python 2/3과 호환되는지 여부
  • POSIX에서는 python실행 파일을 명시 적으로 호출하지 않고 스크립트를 직접 실행하려는 경우에 필요합니다

이것들은 이식성이 있습니까? 어떤 형태가 가장 많이 사용됩니까?

shebang을 수동으로 작성하는 경우 #!/usr/bin/env python특별한 이유가없는 한 항상 사용하십시오. 이 형식은 Windows (Python Launcher)에서도 이해됩니다.

참고 : 설치된 스크립트는 특정 python 실행 파일을 사용해야합니다 (예 : /usr/bin/python또는) /home/me/.virtualenvs/project/bin/python. 셸에서 virtualenv를 활성화하면 일부 도구가 작동하지 않으면 나빠집니다. 운 좋게도, 올바른 shebang은 대부분의 경우 setuptools또는 배포 패키지 도구에 의해 자동으로 만들어 집니다 (Windows에서는 setuptools래퍼 .exe스크립트를 자동으로 생성 할 수 있음 ).

즉, 스크립트가 소스 체크 아웃 상태 인 경우을 볼 수 #!/usr/bin/env python있습니다. 그것이 설치된 경우 shebang은 #!/usr/local/bin/python ( 예 : 후자의 범주에서 경로를 수동으로 작성해서는 안됩니다) 와 같은 특정 Python 실행 파일 의 경로입니다.

사용할지 여부를 선택합니다 python, python2또는 python3오두막에서 참조 PEP 394 - 유닉스 계열 시스템에 "파이썬"명령을 :

  • ... pythonPython 2 및 3과 소스 호환되는 스크립트에만 shebang 행에서 사용해야합니다.

  • 기본 버전의 Python에서 최종 변경을 준비하기 위해 Python 2 전용 스크립트는 Python 3과 소스 호환 가능하거나 python2shebang 라인에서 사용할 수 있도록 업데이트되어야합니다 .


3
PEP를 언급하는 첫 번째 대답에는 충분한 공감이 없습니다. 응? #!/usr/bin/env python자체 PEP 가 있습니까?
— binki

를 사용하지 마십시오 #!/usr/bin/env python. "항상 사용"을 제안하지 마십시오 #!/usr/bin/env python. 99 %의 사례 (답변에 포함 된 이유)에서 잘못된 일입니다.
— 제이 설리반

1
@JaySullivan 소스 체크 아웃과 설치된 스크립트의 차이점을 이해하십니까? 나는 그 제안을지지한다. 잘 작동한다.
— jfs

1
@ jfs : 내 의견을 다시 읽은 후 내 요점을 완전히 파악하지 못했습니다. 내가 의미하는 바는 대부분의 사람들이 'python'이 아닌 'python2'또는 'python3'을 사용하고 싶어한다는 것입니다. 기술적으로 OP 질문 인 전체 경로 또는 환경을 통해 해결할지 여부는 귀하가 대답했으며 그 시점에 동의하지 않습니다.
— 제이 설리반

@JaySullivan 동의합니다. 답에서 pep의 인용문을 읽었습니까? 그것은 같은 것을 말합니다.
— jfs

15

둘 이상의 Python 버전이 있고 특정 버전에서 스크립트를 실행해야하는 경우 she-bang은 스크립트가 직접 실행될 때 올바른 버전이 사용되도록 할 수 있습니다. 예를 들면 다음과 같습니다.

#!/usr/bin/python2.7

스크립트는 완전한 Python 명령 행 또는 가져 오기를 통해 계속 실행될 수 있습니다.이 경우 she-bang은 무시됩니다. 그러나 스크립트가 직접 실행되기 때문에 이것이 그녀를 사용하는 적절한 이유입니다.

#!/usr/bin/env python 일반적으로 더 나은 접근 방법이지만 특수한 경우에 도움이됩니다.

일반적으로 Python 가상 환경을 설정하는 것이 좋습니다.이 경우 제네릭 #!/usr/bin/env python은 virtualenv에 대한 올바른 Python 인스턴스를 식별합니다.


공간이 실패하지 않습니까?
— RandomInsano

1
@RandomInsano, 나는 그렇게 생각하지 않습니다. 공백은 꽤 일반적으로 보이며이 그물에 허용되는 사용법으로 많은 증거가 있습니다. 그러나 나는 공간이없는 것이 아마도 더 정식적인 사용법이라고 생각합니다.
— Chris Johnson

1
당신은 분명히 이것에 맞습니다. bash와 tcsh에서 테스트했습니다.
— RandomInsano

결과 which는 작동 할 문자열을 제공합니다. 그것을 사용하기 위해 내장에 대해 걱정할 필요가 없습니다.
— SDsolar

10

스크립트가 실행 가능한 경우 shebang을 추가해야합니다. 대상 플랫폼에서 작동하도록 shebang을 올바른 것으로 수정하는 설치 소프트웨어로 스크립트를 설치해야합니다. 이에 대한 예는 distutils 및 Distribute입니다.


1
#을 수정할 필요는 없습니다! 나중에 줄. 그것이 / usr / bin / env의 목적입니다. 특정 파이썬 인터프리터에 대한 하드 코딩은 좋은 것보다 더 해를 끼칠 수 있습니다. 다른 파이썬 버전을 설치하거나 배포판의 파이썬과 커스텀 파이썬 설치 사이를 전환하는 것은 매우 취약합니다.
— vog jan

우분투에서 결과를 사용하면 which시스템 명령 등에 사용되는 기본값이 자동으로 선택됩니다. 그것은 일반적이며 시스템은 적절한 설치를 위해 그것을 조종합니다.
— SDsolar

9

shebang의 목적은 쉘에서 스크립트를 실행하려고 할 때 스크립트가 인터프리터 유형을 인식하는 것입니다. 대부분은 아니지만 항상 통역사를 외부에 제공하여 스크립트를 실행합니다. 사용법 예 :python-x.x script.py

shebang 선언자가없는 경우에도 작동합니다.

첫 번째가 더 "이동식"인 이유는 시스템 실행 파일이있는 모든 대상을 설명하는 선언을 /usr/bin/env포함하기 때문 PATH입니다.

참고 : 토네이도는 세방을 엄격하게 사용하지 않으며 장고는 엄격하게 사용하지 않습니다. 응용 프로그램의 주요 기능을 실행하는 방법에 따라 다릅니다.

또한 : 파이썬에 따라 다르지 않습니다.


8

때로는 대답이 명확하지 않은 경우 (예 또는 아니오로 결정할 수 없음을 의미) 너무 중요하지 않으며 대답 이 명확 해질 때까지 문제를 무시할 수 있습니다 .

#!유일한 목적은 스크립트를 실행하기위한 것입니다. 장고는 자체적으로 소스를로드하여 사용합니다. 어떤 인터프리터를 사용해야하는지 결정할 필요가 없습니다. 이런 식으로, #!실제로 여기서는 의미가 없습니다.

일반적으로 모듈이고 스크립트로 사용할 수없는 경우을 사용할 필요가 없습니다 #!. 다른 한편으로, 모듈 소스는 종종 if __name__ == '__main__': ...최소한의 기능 테스트를 포함합니다. 그런 다음 #!다시 의미가 있습니다.

사용하는 좋은 이유 중 하나 #!는 Python 2와 Python 3 스크립트를 모두 사용하는 것입니다. 서로 다른 버전의 Python으로 해석해야합니다. 이런 식 python으로 스크립트를 수동으로 시작할 때 ( #!내부 없이 ) 사용해야 하는 것을 기억해야 합니다 . 이러한 스크립트가 혼합되어 있으면 #!내부 를 사용하여 실행 가능하게 만들고 실행 파일로 실행 하는 것이 좋습니다 (chmod ...).

MS-Windows를 사용할 #!때 최근까지도 말이되지 않았습니다. Python 3.3에는 #!줄 을 읽고 설치된 Python 버전을 감지하며 정확하거나 명시 적으로 원하는 Python 버전을 사용 하는 Windows Python Launcher (py.exe 및 pyw.exe)가 도입되었습니다 . 확장 프로그램과 프로그램을 연결할 수 있으므로 Windows에서 유닉스 기반 시스템의 실행 플래그와 유사한 동작을 얻을 수 있습니다.


3

최근 Windows 7에 Python 3.6.1을 설치할 때 shebang 라인을 처리 해야하는 Windows 용 Python Launcher도 설치했습니다. 그러나 Python Launcher 가이 작업을 수행하지 않는다는 것을 알았습니다 .shebang 줄은 무시되었고 Python 2.7.13이 항상 사용되었습니다 (py -3을 사용하여 스크립트를 실행하지 않는 한).

이 문제를 해결하려면 Windows 레지스트리 키를 편집해야했습니다 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command. 이것은 여전히 ​​가치가 있었다

"C:\Python27\python.exe" "%1" %*

이전 Python 2.7 설치에서. 이 레지스트리 키 값을

"C:\Windows\py.exe" "%1" %*

Python Launcher shebang 라인 처리는 위에서 설명한대로 작동했습니다.


2

다른 모듈이 설치되어 있고 특정 Python 설치를 사용해야하는 경우 shebang은 처음에는 제한적인 것으로 보입니다. 그러나 다음과 같은 트릭을 사용하여 shebang을 먼저 쉘 스크립트로 호출 한 다음 python을 선택할 수 있습니다. 이것은 매우 유연한 imo입니다.

#!/bin/sh
#
# Choose the python we need. Explanation:
# a) '''\' translates to \ in shell, and starts a python multi-line string
# b) "" strings are treated as string concat by python, shell ignores them
# c) "true" command ignores its arguments
# c) exit before the ending ''' so the shell reads no further
# d) reset set docstrings to ignore the multiline comment code
#
"true" '''\'
PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    echo Using preferred python $PREFERRED_PYTHON
    exec $PREFERRED_PYTHON "$0" "$@"
elif [ -x $ALTERNATIVE_PYTHON ]; then
    echo Using alternative python $ALTERNATIVE_PYTHON
    exec $ALTERNATIVE_PYTHON "$0" "$@"
else
    echo Using fallback python $FALLBACK_PYTHON
    exec python3 "$0" "$@"
fi
exit 127
'''

__doc__ = """What this file does"""
print(__doc__)
import platform
print(platform.python_version())

또는 여러 파이썬 스크립트에서 코드 재사용을 촉진하는 것이 더 좋습니다.

#!/bin/bash
"true" '''\'; source $(cd $(dirname ${BASH_SOURCE[@]}) &>/dev/null && pwd)/select.sh; exec $CHOSEN_PYTHON "$0" "$@"; exit 127; '''

그런 다음 select.sh에는 다음이 있습니다.

PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    CHOSEN_PYTHON=$PREFERRED_PYTHON
elif [ -x $ALTERNATIVE_PYTHON ]; then
    CHOSEN_PYTHON=$ALTERNATIVE_PYTHON
else
    CHOSEN_PYTHON=$FALLBACK_PYTHON
fi

1
이와 같은 폴리 글롯이 일반적으로 좋은 방법인지는 확실하지 않지만 매우 흥미로운 접근 방식이며 아마도 가장 유연한 대답 일 것입니다.
— Ryan Amos

1
매우 시원합니다. 나는 당신이 그렇게 할 수 있다는 것을 몰랐습니다
— user2233949

1

답변 : 명령 줄 실행 가능 스크립트로 만들려는 경우에만 해당합니다.

절차는 다음과 같습니다.

사용할 적절한 shebang 문자열을 확인하여 시작하십시오.

which python

그 출력을 가져 와서 첫 번째 줄에 (shebang #!와 함께) 추가하십시오.

내 시스템에서는 다음과 같이 응답합니다.

$which python
/usr/bin/python

그래서 당신의 shebang은 다음과 같이 보일 것입니다 :

#!/usr/bin/python

저장 후에도 파이썬은 첫 번째 줄을 주석으로 볼 수 있기 때문에 여전히 이전과 같이 실행됩니다.

python filename.py

명령을 만들려면 .py 확장자를 삭제하도록 복사하십시오.

cp filename.py filename

파일 시스템에 이것이 실행 가능함을 알리십시오.

chmod +x filename

그것을 테스트하려면 다음을 사용하십시오.

./filename

가장 좋은 방법은 $ PATH의 다른 곳으로 옮기는 것이므로 파일 이름 자체 만 입력하면됩니다.

sudo cp filename /usr/sbin

그렇게하면 모든 곳에서 작동합니다 (파일 이름 앞에 ./없이)


이것이 최선의 방법인지 의심 스럽고 GlassGhost의 솔루션을 사용하는 것이 좋습니다 .
— colidyre 2016 년

나는 이것이 도움이되었고 그것은 나에게 아름답게 일했다. 이것은 잘 설명되었습니다. 그러나 이것이 왜 모범 사례가 아닌지를 나타내는 의견에 감사드립니다. 배우고 싶어합니다.
— Charles Carriere

0

절대 대 논리 경로 :

이것은 실제로 파이썬 인터프리터의 경로 가 이식성과 관련하여 절대 또는 논리 ( /usr/bin/env) 인지 여부에 대한 질문 입니다.

이것과 증거를 지원하지 않고 일반적인 방식으로 문제에 대해 이야기를 다른 스택 사이트의 다른 답변을 만남, 나는 정말, 수행 한 정말 온이 매우 질문에, 세분화 된 테스트 및 분석을 unix.stackexchange.com . 여기에 답을 붙여 넣는 대신 비교 분석에 관심이있는 사람들이 그 답을 지적하겠습니다.

https://unix.stackexchange.com/a/566019/334294

Linux 엔지니어이기 때문에 필자의 목표는 항상 내 개발자 클라이언트에게 가장 적합하고 최적화 된 호스트를 제공하는 것이므로 Python 환경 문제는 실제로 확실한 답이 필요했습니다. 테스트 후 나의 견해 는 그녀 의 논리적 경로가 (2) 옵션 중 더 낫다는 것이었다.


-3

먼저 사용

which python

이것은 파이썬 인터프리터 (이진)가있는 위치로 출력을 줄 것입니다.

이 출력은 다음과 같습니다.

/usr/bin/python

또는

/bin/python

이제 shebang 라인을 적절히 선택하여 사용하십시오.

일반화하려면 다음을 사용할 수 있습니다.

#!/usr/bin/env

또는

#!/bin/env

3
이것은 아마도 다른 시스템에는 이식성이 없을 것입니다. #!/usr/bin/env당신을위한 올바른 선택을합니다.
— fragmentedreality

그렇기 때문에 which명령 을 사용하는 이유 는 특정 시스템에 맞는 문자열을 반환하는 것입니다.
— SDsolar

1
... 다음 실행, 스크립트가 다른 컴퓨터에서 실행될 때마다 which python다시 스크립트를 변경하면 현재의 오두막에서 출력 다릅니다
— fragmentedreality

2
-1 가장 취약한 솔루션입니다. 파이썬 스크립트가 작성된 시스템에 대해서만 정확해야합니다. 이식성을 위해 #! / usr / bin / env python3 사용
— Myles Hollowed
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.