python == python2 또는 python == python3 ? Python py2k 스크립트를 패키지하고 배포하는 방법은 무엇입니까?

python == python2 또는 python == python3 ? Python py2k 스크립트를 패키지하고 배포하는 방법은 무엇입니까?

시스템에 따라 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명령을 사용합니다 . 그런 다음 다시 시작됩니다(또는 찾을 수 없으면 중단됩니다).python2PATH

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를 사용해야 합니다.

관련 정보