Shebang을 Python 스크립트에 넣어야합니까? 어떤 형태로?
#!/usr/bin/env python
또는
#!/usr/local/bin/python
이것들은 이식성이 있습니까? 어떤 형태가 가장 많이 사용됩니까?
#!/usr/bin/python
첫 번째 옵션 비교? 나는 이것을 많은 예제 코드에서 볼 수 있습니다. 편집 : 아마 이것이 답입니다 .. stackoverflow.com/a/2429517/1156245
Shebang을 Python 스크립트에 넣어야합니까? 어떤 형태로?
#!/usr/bin/env python
또는
#!/usr/local/bin/python
이것들은 이식성이 있습니까? 어떤 형태가 가장 많이 사용됩니까?
#!/usr/bin/python
첫 번째 옵션 비교? 나는 이것을 많은 예제 코드에서 볼 수 있습니다. 편집 : 아마 이것이 답입니다 .. stackoverflow.com/a/2429517/1156245
답변:
스크립트의 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"
/usr/bin
당신이 확신 할 수있는 방법을 다음 env
에서 찾을 수 /usr/bin
. 파이썬이 비표준 위치에 설치되면 파이썬이 비표준 방식으로 설정되고 결과적으로 스크립트가 빠르게 실패해야 함을 의미합니다. 파이썬 인터프리터의 속성에 대한 가정을하고 최선을 다하는 것과는 반대로.
env
는 항상 에서 찾을 수 /usr/bin/
있으며 그 작업은을 사용하여 bin (예 : python)을 찾는 것 PATH
입니다. 파이썬 설치 방법에 관계없이 경로가이 변수에 추가되고 env
찾을 수 있습니다 (그렇지 않으면 파이썬이 설치되지 않음). 즉의 작업의 env
전체이다, 이유 가 존재하는 이유. 환경을 경고하는 것입니다 (설치 경로를 포함하여 env 변수 설정 및 경로 포함). 사람들은 항상이 명령이 항상 같은 장소에있는 경우에만 작동한다는 것을 알고 있습니다. 그것은 단지 주어진 것입니다
/usr/bin/env
(보편적?) 널리 이외의 어떤 표준에 의해 보장되지 채택 규칙 ...
정말 맛의 문제 일뿐입니다. shebang을 추가하면 사람들이 원하는 경우 스크립트를 직접 호출 할 수 있습니다 (실행 파일로 표시되어 있다고 가정). 생략하면 python
수동으로 호출해야합니다.
프로그램 실행의 최종 결과는 어느 쪽에도 영향을 미치지 않습니다. 수단의 옵션 일뿐입니다.
chmod a+x [your-script].py
것이 실행 가능해야 ./[your-script.py]
하며 쉘을 호출하면 됩니다.
Shebang을 Python 스크립트에 넣어야합니까?
shebang을 Python 스크립트에 넣어서 다음을 표시하십시오.
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 - 유닉스 계열 시스템에 "파이썬"명령을 :
...
python
Python 2 및 3과 소스 호환되는 스크립트에만 shebang 행에서 사용해야합니다.기본 버전의 Python에서 최종 변경을 준비하기 위해 Python 2 전용 스크립트는 Python 3과 소스 호환 가능하거나
python2
shebang 라인에서 사용할 수 있도록 업데이트되어야합니다 .
#!/usr/bin/env python
자체 PEP 가 있습니까?
#!/usr/bin/env python
. "항상 사용"을 제안하지 마십시오 #!/usr/bin/env python
. 99 %의 사례 (답변에 포함 된 이유)에서 잘못된 일입니다.
둘 이상의 Python 버전이 있고 특정 버전에서 스크립트를 실행해야하는 경우 she-bang은 스크립트가 직접 실행될 때 올바른 버전이 사용되도록 할 수 있습니다. 예를 들면 다음과 같습니다.
#!/usr/bin/python2.7
스크립트는 완전한 Python 명령 행 또는 가져 오기를 통해 계속 실행될 수 있습니다.이 경우 she-bang은 무시됩니다. 그러나 스크립트가 직접 실행되기 때문에 이것이 그녀를 사용하는 적절한 이유입니다.
#!/usr/bin/env python
일반적으로 더 나은 접근 방법이지만 특수한 경우에 도움이됩니다.
일반적으로 Python 가상 환경을 설정하는 것이 좋습니다.이 경우 제네릭 #!/usr/bin/env python
은 virtualenv에 대한 올바른 Python 인스턴스를 식별합니다.
which
는 작동 할 문자열을 제공합니다. 그것을 사용하기 위해 내장에 대해 걱정할 필요가 없습니다.
스크립트가 실행 가능한 경우 shebang을 추가해야합니다. 대상 플랫폼에서 작동하도록 shebang을 올바른 것으로 수정하는 설치 소프트웨어로 스크립트를 설치해야합니다. 이에 대한 예는 distutils 및 Distribute입니다.
which
시스템 명령 등에 사용되는 기본값이 자동으로 선택됩니다. 그것은 일반적이며 시스템은 적절한 설치를 위해 그것을 조종합니다.
shebang의 목적은 쉘에서 스크립트를 실행하려고 할 때 스크립트가 인터프리터 유형을 인식하는 것입니다. 대부분은 아니지만 항상 통역사를 외부에 제공하여 스크립트를 실행합니다. 사용법 예 :python-x.x script.py
shebang 선언자가없는 경우에도 작동합니다.
첫 번째가 더 "이동식"인 이유는 시스템 실행 파일이있는 모든 대상을 설명하는 선언을 /usr/bin/env
포함하기 때문 PATH
입니다.
참고 : 토네이도는 세방을 엄격하게 사용하지 않으며 장고는 엄격하게 사용하지 않습니다. 응용 프로그램의 주요 기능을 실행하는 방법에 따라 다릅니다.
또한 : 파이썬에 따라 다르지 않습니다.
때로는 대답이 명확하지 않은 경우 (예 또는 아니오로 결정할 수 없음을 의미) 너무 중요하지 않으며 대답 이 명확 해질 때까지 문제를 무시할 수 있습니다 .
#!
유일한 목적은 스크립트를 실행하기위한 것입니다. 장고는 자체적으로 소스를로드하여 사용합니다. 어떤 인터프리터를 사용해야하는지 결정할 필요가 없습니다. 이런 식으로, #!
실제로 여기서는 의미가 없습니다.
일반적으로 모듈이고 스크립트로 사용할 수없는 경우을 사용할 필요가 없습니다 #!
. 다른 한편으로, 모듈 소스는 종종 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에서 유닉스 기반 시스템의 실행 플래그와 유사한 동작을 얻을 수 있습니다.
최근 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 라인 처리는 위에서 설명한대로 작동했습니다.
다른 모듈이 설치되어 있고 특정 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
사용할 적절한 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
그렇게하면 모든 곳에서 작동합니다 (파일 이름 앞에 ./없이)
이것은 실제로 파이썬 인터프리터의 경로 가 이식성과 관련하여 절대 또는 논리 ( /usr/bin/env
) 인지 여부에 대한 질문 입니다.
이것과 증거를 지원하지 않고 일반적인 방식으로 문제에 대해 이야기를 다른 스택 사이트의 다른 답변을 만남, 나는 정말, 수행 한 정말 온이 매우 질문에, 세분화 된 테스트 및 분석을 unix.stackexchange.com . 여기에 답을 붙여 넣는 대신 비교 분석에 관심이있는 사람들이 그 답을 지적하겠습니다.
https://unix.stackexchange.com/a/566019/334294
Linux 엔지니어이기 때문에 필자의 목표는 항상 내 개발자 클라이언트에게 가장 적합하고 최적화 된 호스트를 제공하는 것이므로 Python 환경 문제는 실제로 확실한 답이 필요했습니다. 테스트 후 나의 견해 는 그녀 의 논리적 경로가 (2) 옵션 중 더 낫다는 것이었다.
먼저 사용
which python
이것은 파이썬 인터프리터 (이진)가있는 위치로 출력을 줄 것입니다.
이 출력은 다음과 같습니다.
/usr/bin/python
또는
/bin/python
이제 shebang 라인을 적절히 선택하여 사용하십시오.
일반화하려면 다음을 사용할 수 있습니다.
#!/usr/bin/env
또는
#!/bin/env
#!/usr/bin/env
당신을위한 올바른 선택을합니다.
which
명령 을 사용하는 이유 는 특정 시스템에 맞는 문자열을 반환하는 것입니다.
which python
다시 스크립트를 변경하면 현재의 오두막에서 출력 다릅니다