시스템에 따라 python
== python2
또는 python
== 입니다 python3
.
다음으로 시작하는 실행 가능한 Python 스크립트:
#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...
Python py3k의 경우 다음과 같습니다.버전 번호와 함께 사용해야 하거나 사용할 수 있다는 내용이 문서에 제공되어 있습니다., 그래서 저는 이렇게 합니다:
#!/usr/bin/env python3
하지만 py2k 스크립트에서 뭔가 잘못된 것을 발견했습니다.
그리고py2k 문서다음을 사용하도록 작성되었습니다: #! /usr/bin/env python
,
일부 *nix-es에서는 python py3k가 기본값이므로 python==python3입니다. (예를 들어ArchLinux 파이썬 패키지, 여기파이썬 패키지 파일).
이를 처리하기 위해 배포용 Python 스크립트를 어떻게 패키징(구성, 제작) 및/또는 준비합니까?
사용자가 (환경을 수정하지 않고) 쉽게 실행할 수 있는 패키지를 만들어달라고 요청합니다.
python py3k 스크립트에서 했던 것처럼 python py2k 스크립트에서도 동일한 트릭을 수행하고 다음과 같이 설정할 수 있습니까 #!/usr/bin/env python2
? 모든 Python 배포판에는 py2k python2
파일이 포함되어 있다고 확신하는데 #!/usr/bin/env python2
이것이 작동합니까?
그렇다면 표준으로 권장되지 않는 이유는 무엇입니까?파이썬 py2k 문서?
답변1
스크립트는 Python 버전을 확인하고 Python 3인 경우 Python 2로 다시 시작할 수 있습니다. 스크립트 헤드 근처에 다음을 추가합니다.
if sys.version > '3':
python2 = os.popen('which python2 2> /dev/null').read().rstrip()
if python2:
args = sys.argv[:]
args.insert(0,python2)
os.execv(python2,args)
else:
sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))
이는 환경에서 시스템 which
명령을 사용합니다 . 그런 다음 다시 시작됩니다(또는 찾을 수 없으면 중단됩니다).python2
PATH
Python 3에서 실행하려면 스크립트가 유효한 Python 3 구문이어야 합니다.
또한 를 호출하기 전에 모든 출력을 플러시해야 합니다 execv
. 그렇지 않으면 손실됩니다. 예를 들어, sys.stdout.flush()
호출하기 전에 추가하면 execv
모든 문이 새로 고쳐집니다 print
.
답변2
이전 버전에서는 대신 작동할 수도 있습니다 . python
시트 python2
탱 라인을 더 명확하게 하려면 .python2 -> python
#!/usr/bin/env python2
답변3
제가 생각하는 "표준"의 정의는 다음과 같습니다.https://www.python.org/dev/peps/pep-0394/
이 PEP는 Python 인터프리터의 기본 버전(즉, python 명령으로 호출되는 버전)에 관계없이 Python 스크립트가 *nix 시스템에서 계속 이식 가능하도록 보장하는 규칙을 제공합니다.
- python2는 Python 2.x 버전을 나타냅니다.
- python3은 Python 3.x의 일부 버전을 참조합니다.
- 현재 모든 배포판에서는 python이 python2와 동일한 대상을 참조하는지 확인해야 합니다.
- 그러나 최종 사용자는 적어도 Arch Linux에서 Python은 python3(이 PEP 생성을 촉발한 변경 사항)을 참조한다는 점을 알아야 합니다. 따라서 Python은 Python 2와 소스 호환되는 스크립트의 shebang 라인에만 사용해야 합니다. 삼.
- Python의 기본 버전에 대한 최종 변경에 대비하여 Python 2 전용 스크립트는 Python 3 소스와 호환되도록 업데이트하거나 shebang 라인에서 python2를 사용해야 합니다.