#을 넣어야합니까! (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.