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


10

시스템에 따라 python== python2python== 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 문서 와 같이 표준으로 제안되지 않습니까?


4
내가 아는 한 항상 python2(설치 된 경우) 실행하는 데 사용할 수 있으며 항상로 버전을 확인할 수 있습니다 python -V. 그것이 python2 또는 3 이되기를 원한다면 원하는 rm /usr/bin/python파이썬 버전에서 가리키는 심볼릭 링크를 만들어야합니다 (예 :) ln -s /usr/bin/python2.5 /usr/bin/python.
Hanan N.

에 대해 알려 주셔서 감사합니다 python2. py2k와 py3k가 있고 기본값 python이 다를 때 사용하는 것이 왜 표준이 아닌지 궁금 합니다. 제거 에 대한 조언은 어떻습니까? 이 예제에는 적합하지 않습니다. 포장에 대해 묻습니다. 다른 구성 / 시스템에서 실행할 수있는 패키지를 만들고 싶습니다. 환경을 수정하는 방법은 없습니다. 내가 아는 한 점검은 어떻습니까-Shebang 에는 적용되지 않습니다 .
Grzegorz Wierzowiecki

@Hanan N.이 말하려는 것은 Python 2.x 코드를 작성하는 경우 #!...python2프로그램에서 사용하고 Python 3.x를 사용 하는 경우을 사용하는 것 #!...python3입니다. 특정 릴리스에서만 작동한다는 것을 알고 있다면 올바른 링크를 얻기 위해 운영 체제에 의존하지 마십시오. 나는 여전히 파이썬 1.5.2가 설치된 시스템을 가지고 작업한다 /usr/bin/python.-나는 오래된 파이썬 릴리즈를 처리하는 코드를 작성하거나 사용한다 python2.
Arcege

2
@Arcege python2시스템에 실행 파일 이 없습니다 (Debian squeeze). python에 대한 심볼릭 링크 python2.6이고 python3에 대한 심볼릭 링크 python3.1이지만 없습니다 python2.
Gilles 'SO- 악의를 멈춰라'

답변:


3

스크립트는 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.


1

이전 버전에서는 python대신 대신 있을 수 있습니다 python2. sheebang 라인을보다 명확하게하기 위해 링크를 만들어 python2 -> python사용할 수 있습니다 #!/usr/bin/env python2.


그러나 언급 된 문제를 해결하지는 못합니다. 문제는 스크립트를 이식성있게 만드는 방법이기 때문에 언급 된 모든 환경에서 실행할 수 있습니다 ( "python" "python2"등)
Grzegorz Wierzowiecki

1

"표준"은 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를 사용하도록 업데이트되어야합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.