IT이야기

파이톤 대본에 #!(쉐뱅)을 넣어야 하나, 어떤 형식을 취해야 하나?

cyworld 2022. 3. 24. 21:44
반응형

파이톤 대본에 #!(쉐뱅)을 넣어야 하나, 어떤 형식을 취해야 하나?

내 파이톤 대본에 쉐뱅을 넣을까?어떤 형태로?

#!/usr/bin/env python 

또는

#!/usr/local/bin/python

이것들도 똑같이 휴대할 수 있는 겁니까?어떤 형태가 가장 많이 사용되나?

참고: 토네이도 프로젝트는 셰방을 사용한다.반면에 장고 프로젝트는 그렇지 않다.

어떤 스크립트의 셰방 라인이든 입력하지 않고 독립 실행형 실행 파일처럼 실행할 수 있는 스크립트의 기능을 결정한다.python터미널에서 미리 또는 파일 관리자에서 두 번 클릭할 때(올바르게 구성된 경우)그럴 필요는 없지만 일반적으로 그렇게 해서 누군가가 편집기에서 파일을 열면, 그들은 그들이 무엇을 보고 있는지 즉시 알게 된다.하지만 어떤 쉬방 라인을 사용하는지가 중요하다.

Python 3 스크립트의 올바른 사용법(기본값: 3.latest):

#!/usr/bin/env python3

(기본값: 버전 2.latest) Python 2 스크립트의 올바른 사용법:

#!/usr/bin/env python2

다음은 사용하지 마십시오(Python 2.x 및 3.x와 모두 호환되는 코드를 작성하는 드문 경우를 제외).

#!/usr/bin/env python

PEP 394에 제시된 이러한 권고사항의 이유는python어느 쪽도 참고할 수 있다python2또는python3서로 다른 시스템으로

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

#!/usr/local/bin/python

"이 경우 /usr/bin/messages 또는 /bin/messages에 설치될 수 있으며, 위의 #!가 실패할 것이다."

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

그건 정말 맛의 문제야.셰방을 추가하는 것은 사람들이 원하면 스크립트를 직접 호출할 수 있다는 것을 의미하며(실행 가능한 것으로 표시된다고 가정할 때), 생략하는 것은 단지 의미일 뿐이다.python수동으로 호출해야 한다.

그 프로그램을 실행한 최종 결과는 어느 쪽이든 영향을 받지 않는다. 그것은 단지 수단의 선택일 뿐이다.

내 파이톤 대본에 쉐뱅을 넣을까?

다음 사항을 나타내려면 Shebang을 Python 스크립트에 넣으십시오.

  • 이 모듈은 스크립트로 실행될 수 있다.
  • python2, python3에서만 실행 가능한지 또는 Python 2/3 호환 가능한지 여부
  • POSIX에서는 호출하지 않고 스크립트를 직접 실행하려는 경우 필요함python명시적으로 실행 가능한

이것들도 똑같이 휴대할 수 있는 겁니까?어떤 형태가 가장 많이 사용되나?

만약 당신이 수동으로 shebang을 쓴다면, 항상 사용하라.#!/usr/bin/env python사용하지 않을 특별한 이유가 없는 한이 양식은 윈도(피톤 런처)에서도 이해할 수 있다.

참고: 설치된 스크립트는 특정 Python 실행 파일을 사용해야 함(예:/usr/bin/python또는/home/me/.virtualenvs/project/bin/python만약 당신이 당신의 껍데기의 가상 환경을 활성화시킨다면 어떤 도구가 고장난다면 그것은 나쁘다.운 좋게도, 정확한 셰방은 대부분의 경우 에 의해 자동으로 만들어진다.setuptools또는 배포 패키지 도구(Windows의 경우)setuptools포장지를 생성할 수 있음.exe자동으로 스크립트).

즉, 스크립트가 소스 체크아웃에 있으면 아마도#!/usr/bin/env python. 설치되면 shebang은 다음과 같은 특정 python 실행 파일의 경로 입니다.#!/usr/local/bin/python(참고: 후자 범주의 경로를 수동으로 작성하지 마십시오.)

사용할지 여부를 선택하려면python,python2또는python3셰뱅에서 PEP 394 - Unix-Like 시스템에 대한 "피톤" 명령을 참조하십시오.

  • ...pythonPython 2와 3 둘 다와 호환되는 소스 스크립트에 대해서만 쉬방 라인에 사용해야 한다.

  • 기본 버전의 Python이 변경될 경우에 대비하여 Python 2 전용 스크립트는 Python 3과 호환되도록 업데이트되거나 또는 사용할 수 있도록 업데이트되어야 한다.python2셰방 라인으로

둘 이상의 Python 버전이 있고 스크립트를 특정 버전으로 실행해야 하는 경우, 다음과 같이 스크립트를 직접 실행할 때 올바른 버전을 사용할 수 있다.

#!/usr/bin/python2.7

스크립트는 전체 Python 명령줄을 통해 실행되거나 가져오기를 통해 실행될 수 있으며, 이 경우 she-bang은 무시된다는 점에 유의하십시오.하지만 대본이 직접 실행되려면, 이것이 시방을 사용해야 하는 적절한 이유다.

#!/usr/bin/env python일반적으로 더 나은 접근 방식이지만, 이것은 특별한 경우에 도움이 된다.

일반적으로 Python 가상 환경을 구축하는 것이 좋으며, 이 경우 일반 환경은#!/usr/bin/env python가상 환경에 적합한 Python 인스턴스(instance)를 식별할 수 있을 것이다.

스크립트가 실행 가능하려면 쉬방을 추가하십시오.또한 대상 플랫폼에서 사용할 수 있도록 셰뱅을 올바른 것으로 수정하는 설치 소프트웨어와 함께 스크립트를 설치해야 한다.이것의 예로는 디스트루틸과 디스트리뷰트가 있다.

셰방의 목적은 셸에서 스크립트를 실행하고자 할 때 스크립트가 통역 유형을 인식하는 것이다.대부분, 항상은 아니지만, 외부적으로 통역사를 공급함으로써 스크립트를 실행한다.사용 예: python-x.x script.py

쉐방 선언기가 없어도 될 겁니다.

첫번째가 더 "휴대용"인 이유는,/usr/bin/env당신의 것을 포함한다.PATH시스템 실행 파일이 있는 모든 대상을 설명하는 선언.

참고: 토네이도는 셰방을 엄격히 사용하지 않고, 장고는 엄격하게 사용하지 않는다.응용프로그램의 주요 기능을 실행하는 방법에 따라 달라진다.

또한: 그것은 파이톤에 따라 달라지지 않는다.

때때로 대답이 그다지 명확하지 않으면(그렇든 아니든 결정할 수 없다는 뜻), 그리 큰 문제가 되지 않고, 답이 분명해질 때까지 문제를 무시할 수 있다.

#!대본을 시작하는 것만이 목적이다.장고는 그 원천을 스스로 적재하여 사용한다.어떤 통역을 사용해야 하는지 결정할 필요가 없다.이쪽으로, 더.#!사실 말이 안 돼

일반적으로 모듈로서 대본으로 사용할 수 없는 경우, 대본을 사용할 필요가 없다.#!반면에, 모듈 소스는 종종if __name__ == '__main__': ...최소한 기능성에 대한 약간의 사소한 테스트가 필요하다.그러면.#!다시 말이 되네

한 가지 좋은 사용 이유#!Python 2와 Python 3 스크립트를 모두 사용하는 경우. 이 스크립트는 다른 버전의 Python으로 해석되어야 한다.이렇게 하면, 당신은 무엇을 기억해야 하는지 기억해야 한다.python스크립트를 수동으로 시작할 때 사용해야 함(단,#!안쪽에그런 대본들이 섞여 있다면 그 대본을 이용하는 것이 좋다.#!내부에서 실행 가능한 파일로 만들고 실행 파일로 실행하십시오(chmod ...).

MS-Windows를 사용하는 경우#!최근까지 아무런 감각도 없었다.Python 3.3은 Windows Python Launchor(py.exe 및 fyw.exe)를 도입하여 이 프로그램을#!Python의 설치된 버전을 검색하고 올바른 버전 또는 명시적으로 원하는 버전의 Python을 사용하십시오.확장자는 프로그램과 연결될 수 있으므로 윈도우즈에서 Unix 기반 시스템의 실행 플래그와 유사한 동작을 취할 수 있다.

최근 윈도7에 파이썬 3.6.1을 설치했을 때 쉐방 라인을 처리해야 하는 윈도용 파이썬 런처도 설치했다.그러나 나는 파이톤 런처(Python Launchor)가 이렇게 하지 않았다는 것을 알게 되었다: 셰방 라인은 무시되고 파이톤 2.7.13은 항상 사용되었다(fy -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 설치를 사용해야 하는 경우, 처음에는 shebang이 제한되어 있는 것으로 나타난다.단, 셰방이 먼저 조개문자로 호출되도록 하기 위해 아래와 같은 재주를 부린 다음 파이썬을 선택할 수 있다.이것은 매우 유연한 이미오:

#!/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())

또는 여러 Python 스크립트에서 코드를 쉽게 재사용할 수 있도록 다음과 같이 하십시오.

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

그리고 나서 선택한다.sh has:

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

답변: 명령줄 실행 스크립트를 만들 계획인 경우에만 해당.

절차는 다음과 같다.

사용할 적합한 쉬방 문자열을 확인하여 시작하십시오.

which python

거기서 출력을 받아서 첫 줄에 (쉐뱅 #!)를 더한다.

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

$which python
/usr/bin/python

그래서 네 시방은 다음과 같이 보일 것이다.

#!/usr/bin/python

저장 후에도 여전히 예전처럼 운영될 것이다. 왜냐하면 python은 그 첫 줄을 코멘트로 볼 것이기 때문이다.

python filename.py

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

cp filename.py filename

파일 시스템에 실행 파일임을 알리십시오.

chmod +x filename

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

./filename

최상의 방법은 $PATH의 어딘가로 옮기는 것이므로 입력만 하면 파일 이름만 입력할 수 있다.

sudo cp filename /usr/sbin

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

명령줄에서 실행 가능한 파일인 경우

#! /usr/bin/env python3

그렇지 않으면 쉐방이 필요 없다(물론 해롭지는 않다).

이것은 정말로 파이톤 통역관의 경로가 절대적이어야 하는지 논리적이어야 하는지에 대한 질문이다./usr/bin/env휴대성에 관한 것.

그 행동을 철저히 시험해 본 나의 견해는 두 가지 선택사항 중에서 시방에서의 논리적인 경로가 더 낫다는 것이다.

Linux Engineer가 되는 나의 목표는 항상 개발자 클라이언트에 가장 적합하고 최적화된 호스트를 제공하는 것이기 때문에 Python 환경의 문제는 내가 정말 확실한 해답이 필요한 것이다.증거 없이 일반적인 방법으로 이 문제에 대해 이야기했던 스택 오버플로 사이트와 다른 스택 오버플로 사이트에서 다른 답변을 접하면서, 나는 바로 이 질문에 대해 매우 세밀한 테스트와 분석을 수행해 보았다.SE.

pyenv와 같은 가상 환경을 사용하는 경우 쓰는 것이 좋다.#!/usr/bin/env pythonpyenv 설정은 어느 버전의 python과 어느 파일 위치에서 스크립트를 실행하기 시작하는지 제어한다.

만약 당신의 코드가 버전에 특정한 것으로 알려져 있다면, 만약 당신이 쉐뱅에서 예상 버전을 지정한다면 당신의 스크립트가 왜 그들의 환경에서 동작하지 않는지 다른 사람들에게 도움이 될 것이다.

파일을 실행 가능으로 설정하려면 스크립트에 shebang 줄을 추가해야 한다.

#!/usr/bin/env python3 

이 방법은 리눅스의 특정 원위치에 의존하지 않고 거의 모든 원위치에 사용될 수 있다는 점에서 더 나은 선택이다. 원위치에 따라 다른 환경변수로부터 python3 경로를 찾기 때문이다.

반면에

#!/usr/local/bin/python3 

python3의 distro 특정 경로가 될 수 있으며 python3이 이 경로에서 발견되지 않으면 작동하지 않으며, 한 distro에서 다른 Linux로 마이그레이션할 때 개발자에게 혼동과 모호성을 초래할 수 있다.

참조URL: https://stackoverflow.com/questions/6908143/should-i-put-shebang-in-python-scripts-and-what-form-should-it-take

반응형