Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 394 – Unix 계열 시스템의 “python” 명령

Author:
Kerrick Staley <mail at kerrickstaley.com>, Alyssa Coghlan <ncoghlan at gmail.com>, Barry Warsaw <barry at python.org>, Petr Viktorin <encukou at gmail.com>, Miro Hrončok <miro at hroncok.cz>, Carol Willing <willingc at gmail.com>
Status:
Active
Type:
Informational
Created:
02-Mar-2011
Post-History:
04-Mar-2011, 20-Jul-2011, 16-Feb-2012, 30-Sep-2014, 28-Apr-2018, 26-Jun-2019
Resolution:
Python-Dev message

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

이 PEP는 python 명령을 호출할 때 파이썬 스크립트가 어떻게 동작하는지 설명합니다. 배포판이나 시스템 구성에 따라 python이 설치되어 있을 수도 있고 그렇지 않을 수도 있습니다. python이 설치되어 있다면 그 대상 인터프리터는 python2일 수도 있고 python3일 수도 있습니다. 최종 사용자는 Unix 계열 시스템 간의 이러한 불일치를 알지 못할 수 있습니다. 이 PEP의 목표는 python이 무엇을 가리키는지, 그리고 스크립트가 어떻게 동작할지에 대한 사용자의 혼란을 줄이는 것입니다.

이 PEP의 다음 절에 나오는 권고 사항에서는 다음과 같은 경우의 동작을 설명합니다:

  • 가상 환경을 사용하는 경우
  • python2 또는 python3용 셔뱅을 사용하는 크로스 플랫폼 스크립트를 작성하는 경우

이 PEP의 목표는 스크립트 최종 사용자, 배포판 제공자, 스크립트 유지 관리자 및 작성자에게 동작을 명확히 알리는 것입니다.

권고 사항

권고 사항은 아래에서 자세히 설명합니다. 이 권고 사항이 전제로 하는 기대 사항도 함께 밝힙니다.

Python 런타임 배포자를 위한 지침

  • Unix 계열 소프트웨어 배포판(macOS와 Cygwin 같은 시스템 포함)은 Python 2 인터프리터의 어떤 버전이든 설치될 때마다 python2 명령을 기본 경로에 설치하고, python3와 Python 3 인터프리터에 대해서도 마찬가지로 할 것을 기대합니다.
  • 호출되었을 때 python2는 파이썬 2 인터프리터의 한 버전을 실행해야 하고, python3은 파이썬 3 인터프리터의 한 버전을 실행해야 합니다.
  • python 명령이 설치되어 있다면, 이 명령은 python3 명령과 같은 버전의 파이썬이나 python2 명령과 같은 버전의 파이썬 중 하나를 호출할 것으로 기대됩니다.
  • 배포자는 python 명령의 동작을 다음 중 하나로 설정할 수 있습니다:
    • python2,
    • python3,
    • python 명령을 제공하지 않음, python을 최종 사용자나 시스템 관리자가 설정할 수 있도록 허용.
  • 파이썬 3.x의 idle, pydoc, python-config 명령도 마찬가지로 idle3, pydoc3, python3-config로 사용할 수 있어야 하며, 파이썬 2.x 버전은 idle2, pydoc2, python2-config로 사용할 수 있어야 합니다. 버전 번호가 없는 명령은 python 명령과 같은 버전의 파이썬을 호출하거나, 아예 제공되지 않아야 합니다.
  • 서드파티 Python 스크립트를 패키징할 때, 배포자는 덜 구체적인 셔뱅을 더 구체적인 셔뱅으로 변경할 것을 권장합니다. 이렇게 하면 소프트웨어가 사용 가능한 최신 버전의 Python으로 사용되도록 보장하며, Python 2에 대한 의존성을 제거할 수 있습니다. 다만 무엇을 얼마나 구체적으로 설정할지는 배포자에게 맡깁니다. 구체적인 예는 다음과 같습니다:
    • 파이썬 3.x가 지원되는 경우 python 셔뱅을 python3으로 바꿉니다.
    • 파이썬 3.x가 아직 지원되지 않는 경우 python 셔뱅을 python2로 바꿉니다.
    • 소프트웨어가 파이썬 3.8로 빌드된 경우 python3 셔뱅을 python3.8로 바꿉니다.
  • 가상 환경(PEP 405 venv 패키지 또는 virtualenv나 conda 같은 유사한 도구로 만든 환경)이 활성화되어 있을 때, python 명령은 해당 가상 환경의 인터프리터를 가리켜야 하며 항상 사용할 수 있어야 합니다. (환경의 인터프리터 버전에 따라) python3 또는 python2 명령도 사용할 수 있어야 합니다.

Python 스크립트 배포자를 위한 지침

  • Python 스크립트에서 인터프리터를 다시 호출할 때는 인터프리터 위치에 대한 하드코딩된 가정을 피하기 위해 sys.executable을 조회하는 것이 여전히 권장되는 방법입니다.
  • 최종 사용자에게 가상 환경을 사용하도록 권장하십시오. 이렇게 하면 사용자의 환경을 더 예측 가능하게 만들고(그 결과 문제가 줄어들 수도 있습니다), 사용자의 시스템을 망가뜨리는 일을 피하는 데 도움이 됩니다.
  • 활성화된 가상 환경에서만 실행될 것으로 예상되는 스크립트는 셔뱅 줄을 #!/usr/bin/env python으로 작성할 수 있습니다. 이렇게 하면 스크립트가 활성화된 가상 환경을 따르게 되기 때문입니다.
  • 스크립트가 가상 환경 밖에서 실행될 것으로 예상되는 경우, 개발자는 플랫폼과 설치 방법에 따른 다음과 같은 차이점을 알고 있어야 합니다.
    • 오래된 Linux 배포판은 Python 2를 가리키는 python 명령을 제공할 것이며, python2 명령은 제공하지 않을 가능성이 높습니다.
    • 일부 최신 Linux 배포판은 Python 3을 가리키는 python 명령을 제공할 것입니다.
    • 일부 Linux 배포판은 기본적으로 python 명령을 전혀 제공하지 않지만, python3 명령은 기본적으로 제공할 것입니다.
  • 이러한 환경을 대상으로 할 가능성이 있을 때, 개발자는 설치된 환경에 맞게 셔뱅 줄을 다시 작성하는 Python 패키지 설치 도구를 사용하거나, 셔뱅 줄을 대화식으로 업데이트하는 방법에 대한 안내를 제공하거나, 아니면 대상 환경에 맞춘 더 구체적인 셔뱅 줄을 사용할 수 있습니다.
  • “구형 시스템”과 기본 python 명령이 없는 시스템을 모두 대상으로 하는 스크립트는 절충안을 택하고 이 상황을 문서화해야 합니다. (console_scripts 진입점([9]) 또는 유사한 수단을 통해) 셔뱅을 사용하지 않는 것이 이 문제에 대한 권장 해결책입니다.
  • 특정 환경(컨테이너나 가상 환경 등)만을 위해 설계된 애플리케이션은 계속 python 명령 이름을 사용해도 됩니다.

Python 최종 사용자를 위한 지침

  • 모든 곳에서 사용할 수 있는 것과는 거리가 멀지만, 파이썬을 명시적으로 호출할 때는 여전히 python이 권장되는 표기입니다. 가상 환경이 여러 플랫폼과 파이썬 설치 방식에 걸쳐 일관되게 제공하는 표기가 바로 이것이기 때문입니다.
  • 시스템과 함께 배포되지 않는(또는 시스템을 위해 개발되지 않은) 소프트웨어의 경우, 시스템 Python 설치를 망가뜨리지 않도록 가상 환경을 사용할 것을 권장하며, 필요하다면 conda나 pipenv 같은 환경 관리자를 함께 사용할 수 있습니다.

이 권고 사항은 2011년 3월과 7월([1], [2]), 2012년 2월([4]), 2014년 9월([6])의 관련 python-dev 논의, 2018년 4월 GitHub에서의 논의([7]), 2019년 2월 python-dev에서의 논의([8]), 그리고 2019년 5월/6월의 PEP 갱신 검토([10])에서 나온 결과입니다.

이 PEP의 역사

2011년에는 대부분의 배포판이 python 명령을 파이썬 2의 별칭으로 지정했지만, 일부 배포판은 이를 파이썬 3으로 전환하기 시작했습니다([5]). 전자의 배포판 중 일부는 기본적으로 python2 명령을 제공하지 않았기 때문에, 이전에는 Python 2 코드(또는 sys.executable을 통하지 않고 Python 2 인터프리터를 직접 호출하는 모든 코드)가 수정 없이 모든 Unix 계열 시스템에서 안정적으로 실행될 방법이 없었습니다. 어떤 시스템에서는 python 명령이 잘못된 인터프리터 버전을 호출하고, 다른 시스템에서는 python2 명령이 아예 실패했기 때문입니다. 이 PEP는 원래 배포판 유지 관리자 측의 추가 작업을 최소화하면서 크로스 플랫폼 지원을 복원하는 매우 간단한 메커니즘을 제공했습니다. 간단히 정리하면, 권고 사항은 다음과 같았습니다.

  1. 파이썬 2와 3 모두와 호환되는 코드에는 python 명령이 선호되었습니다(이미 이를 파이썬 3의 별칭으로 지정한 시스템을 포함해 모든 시스템에서 사용할 수 있었기 때문입니다).
  2. python 명령은 항상 파이썬 2를 호출해야 했습니다(파이썬 2 코드가 파이썬 3에서 실행될 때 진단하기 어려운 오류가 발생하는 것을 막기 위해서입니다).
  3. 버전을 명시적으로 지정할 수 있도록 python2와 python3 명령을 사용할 수 있어야 했습니다.

그러나 이러한 권장 사항은 Python 2를 항상 사용할 수 있다고 암묵적으로 가정했습니다. Python 2가 2020년에 수명 종료를 앞두고 있으므로(PEP 373, PEP 404), 배포판들은 Python 2를 선택 사항으로 만들거나 완전히 제거하고 있습니다. 이는 python 명령을 제거하거나 파이썬 3을 호출하도록 전환한다는 뜻입니다. 또한 일부 배포자는 이 PEP의 원래 권고 사항을 따르지 않는 편이 사용자에게 더 낫다고 판단하여, 시스템 관리자가 각자의 환경에서 필요한 대로 시스템을 구성할 수 있는 자유를 제공했습니다.

현재의 근거

2019년 현재, 스크립트 실행 전에 Python 가상 환경(또는 기능적으로 동등한 것)을 활성화하는 것은 플랫폼과 배포판에 걸쳐 일관된 경험을 얻는 한 가지 방법입니다.

따라서 배포자는 소프트웨어 사용자가 적절한 실행 환경을 갖출 것으로 기대할 수 있습니다.

이 권고의 향후 변경

이 권고는 앞으로 몇 년 동안 주기적으로 검토되며, 핵심 개발 팀이 적절하다고 판단할 때 갱신됩니다. 참고로, Python 2.7 시리즈의 정기 유지보수 릴리스는 2020년 1월까지 계속됩니다.

마이그레이션 참고 사항

이 절에는 CPython 핵심 개발자의 공식 권고가 담겨 있지 않습니다. 이는 단지 시스템의 기본 Python 버전으로 Python 3로 마이그레이션하는 것의 다양한 측면에 관한 메모 모음일 뿐입니다. 이러한 전환을 고려하는 배포판에 도움이 되기를 바랍니다.

  • 배포판이 python 명령을 python2에서 python3로 전환하는 데 가장 큰 걸림돌은 배포판 내부의 손상이 아니라, 시스템 관리자와 다른 사용자가 작성한 비공개 서드파티 스크립트의 손상입니다. python 명령이 기본적으로 python3를 호출하도록 바꾼다는 것은, 파이썬 3의 하위 호환되지 않는 변경 사항에 익숙하지 않은 사용자를 상당히 혼란스럽게 할 수 있는 오류와 함께 그러한 스크립트가 동작하지 않게 되는 것을 배포판이 감수하겠다는 뜻입니다. 예를 들어, print가 문(statement)에서 내장 함수로 바뀐 것은 자동 변환기가 처리하기에 비교적 간단하지만, Python 3에서 Python 2 표기법을 사용하려 할 때 발생하는 SyntaxError는 이 변경 사항을 알지 못하는 사용자에게 혼란스러울 수 있습니다:
    $ python3 -c 'print "Hello, world!"'
      File "<string>", line 1
        print "Hello, world!"
              ^
    SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello, world!")?
    

    숙련된 Python 개발자에게는 이것이 당연할 수 있지만, 이러한 스크립트는 Python에 전혀 익숙하지 않은 사람이 실행할 수도 있습니다. 이 PEP가 이전에 python이 계속 python2를 가리키도록 권고한 핵심 이유는 이러한 서드파티 스크립트의 손상을 피하기 위해서였습니다.

  • python: command not found 오류 메시지는 파이썬에 익숙하지 않은 사람에게도 의외로 대처 방법을 쉽게 알려 주는 편입니다.
  • 최신 시스템에는 pythonX.X(예: python3.6) 명령이 존재하며, 이 명령은 Python 인터프리터의 특정 마이너 버전을 호출합니다. 배포판 전용 패키지는 이러한 유틸리티가 있다면 활용하는 것이 유용할 수 있습니다. 특정 메이저 버전의 기본 마이너 버전이 바뀌더라도 코드가 손상되는 것을 막아 주기 때문입니다. 하지만 여러 플랫폼에서 동작하려는 스크립트는 이러한 유틸리티가 있다고 가정해서는 안 되며, 대상 메이저 버전의 여러 최신 마이너 버전에서 테스트하고 필요하다면 마이너 버전 사이에 존재하는 작은 차이를 보완해야 합니다. 이렇게 하면 시스템 관리자가 서로 매우 비슷한 인터프리터 버전을 여러 개 설치할 필요가 없어집니다.
  • 배포판이 pythonX.X 바이너리를 제공하는 경우, python2와 python3 명령은 별도의 바이너리 파일로 제공하지 말고 그 파일들 중 하나를 가리켜야 합니다.
  • 다른 배포판에서 동작할 의도가 없는 코드라도, 배포판 전용 패키지는 python 대신 python3 (또는 python2)를 사용할 것을 강력히 권장합니다. 이렇게 하면 배포판이 나중에 python 명령이 호출하는 Python 인터프리터의 버전을 변경하기로 결정하거나, 시스템 관리자가 배포판 기본값과 다른 메이저 버전의 사용자 정의 python 명령을 설치하는 경우에 문제가 줄어듭니다.
  • 위 사항을 지키면서 시스템 관리자가 python 명령을 바꿀 수 있도록 허용한다면, python 명령은 항상 인터프리터 바이너리에 대한 링크(또는 링크에 대한 링크)로 구현해야 하며 그 반대로 구현해서는 안 됩니다. 그래야 시스템 관리자가 설치된 python 파일을 교체하기로 하더라도, 이전에 설치된 바이너리를 실수로 삭제하지 않고 교체할 수 있습니다.
  • 파이썬 2 인터프리터가 점점 드물어지더라도, 스크립트가 그냥 python 대신 python3 규약을 계속 사용하는 것은 여전히 합리적입니다.
  • 이러한 규약을 지키면, python 명령은 사용자 편의를 위해 대화형으로 실행되거나, 가상 환경 또는 이와 비슷한 메커니즘을 사용할 때만 실행되게 됩니다.

하위 호환성

python2/python3 규약을 따르는 스크립트를 이 명령들을 지원하지 않는 시스템에서 실행하면 잠재적인 문제가 생길 수 있습니다. 하지만 시스템 관리자가 이 심볼릭 링크를 만들기만 하면 더 이상의 문제를 피할 수 있으므로, 이는 대부분 문제가 되지 않습니다. 이는 Python 2 고유의 문법을 포함한 스크립트를 Python 3 인터프리터로 실행하거나 그 반대로 실행하려 할 때 발생할 수 있는, 때로는 알기 어려운 오류보다 훨씬 더 명확한 손상입니다.

CPython 참조 인터프리터에 대한 적용

엄밀히 말하면 새로운 기능이지만, CPython 2.7 버전의 make install과 make bininstall 명령은 해당 bin 디렉터리에 다음과 같은 심볼릭 링크 체인을 만들도록 조정되었습니다(체인에 나열된 마지막 항목은 실제로 설치된 바이너리이고, 그 앞의 항목들은 상대 심볼릭 링크입니다):

python -> python2 -> python2.7
python-config -> python2-config -> python2.7-config

macOS 바이너리 설치 프로그램에도 비슷한 조정이 이루어졌습니다.

이 기능은 CPython 2.7.3의 기본 설치 과정에 처음 도입되었습니다.

CPython 3.x 시리즈의 설치 명령은 이미 적절한 심볼릭 링크를 생성합니다. 예를 들어 CPython 3.2는 다음을 생성합니다:

python3 -> python3.2
idle3 -> idle3.2
pydoc3 -> pydoc3.2
python3-config -> python3.2-config

그리고 CPython 3.3은 다음을 생성합니다:

python3 -> python3.3
idle3 -> idle3.3
pydoc3 -> pydoc3.3
python3-config -> python3.3-config
pysetup3 -> pysetup3.3

기본 설치 프로그램에서 이 기능들을 구현하는 진행 상황은 트래커에서 이슈 #12627 ([3])로 관리되었습니다.

PYTHON* 환경 변수에 미치는 영향

python 명령이 가리킬 대상을 무엇으로 정하느냐는 배포판이 여러 Python 관련 환경 변수를 어떻게 해석할 것으로 기대하는지에 암묵적으로 영향을 줍니다. 관련 site-packages 폴더에 *.pth 파일을 사용하는 방법, “사용자별 사이트 패키지” 기능(python -m site 참고), 또는 virtualenv와 같은 더 유연한 도구는 모두 PYTHONPATH를 직접 사용하는 것보다 한 시스템에 여러 버전의 Python이 존재하는 상황을 더 잘 견딥니다.

MS Windows 제외

이 PEP는 Microsoft Windows에 관한 제안을 의도적으로 모두 제외합니다. Windows에 대응하는 해결책을 고안하는 일은 여기서 다루기에 너무 복잡하다고 판단했기 때문입니다. 이 문제는 PEP 397과 python-dev 메일링 리스트의 관련 논의에서 다룹니다.

참고 문헌