PEP 486 – Python 런처가 가상 환경을 인식하도록 만들기
- Author:
- Paul Moore <p.f.moore at gmail.com>
- Status:
- Final
- Type:
- Standards Track
- Created:
- 12-Feb-2015
- Python-Version:
- 3.5
- Post-History:
- 12-Feb-2015
- Resolution:
- Python-Dev message
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
Python용 Windows 설치 프로그램에는 실행할 올바른 Python 인터프리터를 찾아 주는 런처가 포함되어 있습니다(PEP 397 참조). 그러나 이 런처는 가상 환경(virtualenv [1] 또는 PEP 405 기반)을 인식하지 못하므로, 활성화된 virtualenv의 명령을 실행하는 데 사용할 수 없습니다.
이 PEP는 런처가 “virtualenv를 인식”하도록 만들 것을 제안합니다. 즉, 사용할 Python 인터프리터를 명시적으로 지정하지 않고 실행하면, 런처는 설정된 기본 Python으로 넘어가기 전에 현재 활성화된 virtualenv가 있으면 그것을 먼저 사용합니다.
근거
여러 개의 Python을 설치한 Windows 사용자에게는 그중 어느 것을 사용할지 선택하는 수단이 필요합니다. Python 런처는 py 명령을 통해 이 기능을 제공합니다. 이 명령으로 명령줄 인자를 사용하여 설정된 “기본” Python이나 특정 인터프리터를 실행할 수 있습니다. 따라서 일반적인 사용법은 다음과 같습니다:
# Run the Python interactive interpreter
py
# Execute an installed module
py -m pip install pytest
py -m pytest
가상 환경을 사용할 때 py 런처는 virtualenv가 활성화되어 있다는 사실을 인식하지 못하고 계속 시스템 Python을 사용합니다. 따라서 virtualenv에서 같은 명령을 실행하려면 다른 방식으로 명령을 호출해야 합니다:
# Run the Python interactive interpreter
python
# Execute an installed module (these could use python -m,
# which is longer to type but is a little more similar to the
# launcher approach)
pip install pytest
py.test
서로 다른 명령을 사용해야 하면 오류가 발생하기 쉬우며, 많은 경우 그 오류를 즉시 알아차리기 어렵습니다. 이 PEP는 py 명령을 가상 환경에서도 사용할 수 있게 하여, 모든 경우에 첫 번째 형태의 명령을 사용할 수 있도록 할 것을 제안합니다.
구현
virtualenv와 코어 venv 모듈은 모두 virtualenv를 활성화할 때 VIRTUAL_ENV 환경 변수를 설정합니다. 이 PEP는 런처가 시스템의 “기본” Python 인터프리터를 실행하려 할 때마다(즉, py -2.7 같은 특정 버전 플래그를 사용하지 않았을 때) VIRTUAL_ENV 환경 변수를 확인하고, 이 변수가 있으면 기본 시스템 Python 대신 해당 virtualenv의 Python 인터프리터를 실행할 것을 제안합니다.
위에서 언급한 “기본” Python 인터프리터는 (PEP 397에 따라) 시스템에 설치된 최신 버전의 Python이거나 py.ini 설정 파일로 설정한 버전입니다. 사용자가 명령줄에서 Python 버전을 명시적으로 지정하면 (현재와 마찬가지로) 항상 그 버전을 사용합니다.
스크립트 실행에 미치는 영향
런처는 대화형으로 사용될 뿐 아니라 Python 스크립트에 대한 Windows 파일 연결로도 사용됩니다. 이 경우 스크립트 시작 부분의 “셔뱅”(#!) 줄로 실행할 인터프리터를 식별합니다. 전체 경로를 사용할 수도 있고, 특정 버전의 Python(python3이나 python2, 심지어 python3.5)을 사용할 수도 있으며, 기본 인터프리터를 사용하라는 의미인 일반적인 python을 사용할 수도 있습니다.
런처는 #!/usr/bin/env python이라는 특정 셔뱅 줄도 찾습니다. Unix에서 env 프로그램은 $PATH에서 명령을 검색하고, 그렇게 찾은 명령을 실행합니다. 마찬가지로 이 셔뱅 줄이 있으면 런처는 사용자의 현재 %PATH%에서 python.exe를 찾아 실행합니다.
virtualenv를 활성화하면 해당 virtualenv가 PATH에 추가되므로, 활성화된 virtualenv로 스크립트를 실행하는 데 특별한 처리가 필요하지 않습니다. Unix에서와 똑같이 #!/usr/bin/env python 셔뱅 줄을 사용하기만 하면 됩니다. (활성화된 virtualenv가 없고 PATH에 python.exe도 없으면, 런처는 셔뱅 줄이 #!python이었을 때와 똑같이 기본 Python을 찾습니다.)
제외 사항
이 PEP는 Windows에서 Python을 실행할 때 런처를 사용하도록 장려하려는 것이 아닙니다. 기존 문서 대부분은 Python을 실행하는 명령으로 python을, 설치된 Python 명령을 실행하는 데 (예를 들어) pip를 사용한다고 가정합니다. 이러한 문서는 바뀌지 않을 것으로 예상되며, PATH 환경 변수를 직접 관리하기로 한 사용자는 계속 이 형태를 사용할 수 있습니다. 이 PEP의 초점은 오로지 시스템 Python 설치를 다룰 때 런처를 선호하는 사용자가 가상 환경을 사용할 때도 계속 런처를 사용할 수 있게 하는 데 있습니다.
참조 구현
제안된 동작을 구현한 패치는 http://bugs.python.org/issue23465 에서 확인할 수 있습니다.
참고 문헌
Copyright
This document has been placed in the public domain.