시스템에 따라 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 package , 여기서 python package files ).
배포를 위해 파이썬 스크립트를 패키징 (구성, 구성) 및 / 또는 준비하는 방법은?
사용자가 환경을 수정하지 않고 쉽게 실행할 수있는 소프트웨어 패키지를 만드는 방법에 대해 문의합니다.
python py2k 스크립트와 python py3k 스크립트와 동일한 트릭을 수행하고 다음과 같이 설정할 수 #!/usr/bin/env python2
있습니까? 각 python py2k 배포에 python2
파일이 포함되어 있는지 확인할 수 있습니까 #!/usr/bin/env python2
?
그렇다면 왜 파이썬 py2k 문서 와 같이 표준으로 제안되지 않습니까?
답변
스크립트는 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
.
답변
이전 버전에서는 python
대신 대신 있을 수 있습니다 python2
. sheebang 라인을보다 명확하게하기 위해 링크를 만들어 python2 -> python
사용할 수 있습니다 #!/usr/bin/env python2
.
답변
“표준”은 https://www.python.org/dev/peps/pep-0394/에 정의되어 있다고 생각합니다.
이 PEP는 Python 인터프리터의 기본 버전 (python 명령에 의해 호출 된 버전)에 관계없이 * nix 시스템에서 Python 스크립트를 계속 이식 할 수 있도록하는 규칙을 제공합니다.
- python2는 일부 버전의 Python 2.x를 나타냅니다.
- python3은 일부 버전의 Python 3.x를 참조합니다.
- 당분간 모든 배포판은 파이썬이 python2와 동일한 대상을 참조하도록해야합니다.
- 그러나 최종 사용자는 python이 적어도 Arch Linux에서 python3을 참조한다는 것을 알고 있어야합니다 (이 변경 사항은이 PEP의 생성을 자극했습니다) 파이썬 2는 Python 2와 소스 호환되는 스크립트에만 shebang 라인에서 사용해야합니다 그리고 3.
- 기본 버전의 Python에서 최종 변경을 준비하기 위해 Python 2 전용 스크립트는 Python 3과 소스 호환되거나 shebang 행에서 python2를 사용하도록 업데이트되어야합니다.