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

Python 개선 제안 한국어 번역

PEP 704 – 패키지 설치 프로그램에 기본적으로 가상 환경을 요구합니다

Author:
Pradyun Gedam <pradyunsg at gmail.com>
Sponsor:
Brett Cannon <brett at python.org>
PEP-Delegate:
Paul Moore <p.f.moore at gmail.com>
Discussions-To:
Discourse thread
Status:
Withdrawn
Type:
Standards Track
Topic:
Packaging
Created:
16-Jan-2023
Post-History:
16-Jan-2023

Table of Contents

번역·라이선스 안내

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

초록

이 PEP는 Python 3.13 이상에서 pip와 같은 패키지 설치 프로그램이 기본적으로 가상 환경을 요구할 것을 권장합니다.

PEP 철회

이 PEP에 대한 논의 중에 제안된 pip의 UX 변경은 PEP로 통제되지 않는다는 점이 분명해졌습니다. 또한 상당수의 사용자가 pip로 관리되는 의존성과 다른 도구로 관리되는 의존성을 혼합할 수 있어야 한다는 점에 의존하고 있다는 사실도 분명해졌습니다(특히 Conda를 사용할 때 두드러집니다).

더 나아가 제안된 변경의 이점 중 상당 부분은 작성 시점에 이미 수용되고 구현된 PEP 668을 통해 달성할 수 있습니다. 이를 통해 Python 인터프리터의 재배포자는 사용자에게 가상 환경 사용을 요구할지 여부, 사용자에게 표시할 메시지, 그리고 해당 사용자를 대상으로 변경 사항을 어떻게 단계적으로 적용할지를 제어할 수 있습니다.

pip를 사용한 가상 환경 강제가 이 PEP의 주요 초점이었으므로, 다른 주제로 초점을 전환하기보다는 이 PEP를 철회하는 것이 더 적절하다고 판단했습니다.

가상 환경 명명 규칙에 관한 질문과 문제를 해결하기 위한 향후 PEP는 여전히 적절할 수 있지만, 이러한 규칙의 강제보다는 그 규칙이 제공하는 이점에 초점을 맞춘 새로운 PEP로 그러한 노력을 시작할 가치가 있습니다.

동기

Python 가상 환경은 Python 개발 작업 흐름의 필수적인 부분입니다. 그러나 가상 환경은 선택적으로 활성화하는 기능이므로 추가 노력이 필요하며, 사용자에게 다음 중 하나를 요구합니다:

  • 가상 환경을 활성화하거나 비활성화하기 위한 명시적인 단계를 수행해야 합니다
  • 파일을 실행하려면 <path-to-venv>/<bin-path>/<executable>을 사용하십시오.

새로운 사용자의 경우 가상 환경을 사용하지 않아도 모든 것이 올바르게 작동하는 것처럼 보이지만, 그렇지 않은 순간이 옵니다. 또한 가상 환경을 활성화하는 구문과 메커니즘은 플랫폼마다 약간씩 다릅니다. 이로 인해 가상 환경에 대한 소개가 복잡해집니다. 이제 작업 흐름에 추가 단계를 넣는 것을 정당화하려면 가상 환경이 유용한 이유와 방식에 관한 정보와 맥락을 설명해야 하기 때문입니다.

또한 사용자는 pip와 같은 설치 프로그램을 실행하기 전에 가상 환경을 활성화하거나 해당 설치 프로그램이 오류로 종료되도록 구성해야 하므로 실수의 여지도 생깁니다. 일부 Linux 배포판에서는 이를 잊으면 설치 프로그램이 운영 체제가 소유한 파일을 수정할 수 있습니다(환경을 그에 맞게 표시하도록 선택한 배포판에서는 PEP 668을 통해 이 문제가 부분적으로 완화됩니다).

근거

pip와 같은 설치 프로그램의 기본 동작을 변경하여 가상 환경이 활성화되어 있어야 하도록 하면 다음과 같은 효과가 있습니다:

  • 새로운 사용자가 Python을 더 쉽게 시작할 수 있습니다(일관된 경험을 제공하고 가상 환경이 반드시 사용해야 하는 것으로 이해되기 때문입니다)
  • 기본적으로 모든 사용자에게 우발적인 설치 문제의 여지를 줄일 수 있습니다(가상 환경을 사용하고 있지 않을 때 이를 명시적으로 알리기 때문입니다).

가상 환경을 프로젝트 트리 내 .venv라는 디렉터리에 배치하는 규칙을 정하면 일반적인 작업 흐름에서 결정해야 할 사항이 줄어들고 생태계 전반에 명확한 관례가 만들어집니다.

사양

기본적으로 가상 환경 요구

사용자가 활성화된 가상 환경 없이 설치 프로그램을 실행하면 설치 프로그램은 오류 메시지를 출력하고 0이 아닌 종료 코드로 종료해야 합니다.

오류 메시지는 가상 환경이 필요하다는 사실을 사용자에게 알려야 하고, .venv라는 이름의 가상 환경을 생성하고 활성화하는 방법에 관한 셸별 지침을 제공해야 하며, 가상 환경의 생성 및 활성화 방법을 설명하는 문서 페이지 링크를 제공해야 합니다.

자세한 내용은 Implementation Notes를 참조하십시오.

가상 환경 사용 선택 해제

설치 프로그램은 이 요구 사항을 비활성화하여 최종 사용자가 가상 환경 외부에서 사용할 수 있도록 명시적인 옵트인을 제공해야 합니다. 설치 프로그램이 이 기능을 제공하지 않는 경우, 오류 메시지와 문서 페이지에 이를 명시해야 합니다.

변경 사항의 일관된 일정

설치 프로그램은 모든 Python 버전에서 이 기본 동작을 구현하도록 선택할 수 있지만, Python 3.13 이상에서는 구현해야 합니다.

하위 호환성

이 PEP는 가상 환경 외부에서 설치 프로그램을 사용하는 워크플로와 하위 호환되지 않습니다. 이러한 사용자에게는 오류 메시지가 표시되며, 다음 중 하나를 수행해야 합니다.

  • 가상 환경 외부에서 설치 프로그램을 실행하도록 명시적으로 옵트인하거나
  • 가상 환경을 생성하고 사용합니다.

이미 가상 환경을 사용하고 있는 사용자는 이 변경의 영향을 받지 않습니다.

워크플로 도구는 사용자를 대신하여 내부적으로 가상 환경을 관리하므로 영향을 받지 않아야 합니다. 이러한 도구는 이미 설치 프로그램을 실행할 때 가상 환경을 사용하고 있어야 하기 때문입니다.

보안 영향

이 PEP는 새로운 보안 영향을 도입하지 않습니다.

이 내용을 가르치는 방법

이 PEP는 신규 사용자가 Python 패키지를 사용하기 시작하려면 가상 환경을 생성하고 사용하도록 요구합니다. 그러나 Python Packaging User Guide의 “Python 패키지 설치 방법의 기초” 절에서 demonstrated보여 주듯이, 이는 모범 사례입니다. 해당 절에서는 pip를 사용하는 방법을 설명하기 전에 가상 환경이 무엇이며 어떻게 작동하는지 설명합니다.

참조 구현

이 PEP에는 참조 구현이 없습니다. 그러나 제안된 동작은 이미 pip에 대부분 구현되어 있으며, PIP_REQUIRE_VENV 환경 변수를 1로 설정하여 활성화할 수 있습니다. (이 변수를 설정하지 않으면 설치에 가상 환경을 요구하지 않는, 제안된 옵트인 동작이 적용됩니다.)

구현 참고 사항

활성 가상 환경 감지

As discussed in PEP 668, 가상 환경을 안정적으로 감지하는 로직은 다음과 같습니다.:

def is_virtual_environment():
    return sys.base_prefix != sys.prefix or hasattr(sys, "real_prefix")

가상 환경 사용에 관한 문서

패키지 설치 프로그램은 오류 메시지에 문서 페이지 링크를 제공해야 합니다.

이상적으로 이러한 문서 페이지에서는 가상 환경이 무엇인지, 왜 필요한지, venv를 사용하여 가상 환경을 생성하고 활성화하는 방법을 설명해야 합니다. 또한 가장 일반적인 셸과 플랫폼에 대한 지침을 포함해야 합니다.

설치 프로그램마다 이 주제를 다루기 위해 중복된 노력을 줄일 수 있도록 이러한 문서 페이지를 Python Packaging User Guide에서 제공해야 합니다.

거부된 아이디어

가상 환경 디렉터리의 이름을 지정하지 않습니다.

가상 환경 디렉터리에 일관된 이름을 사용하는 것은 몇 가지 이유로 중요합니다.

  1. 사용자가 가상 환경 디렉터리를 더 쉽게 찾고 활성화할 수 있습니다.
  2. 신규 사용자는 가상 환경 디렉터리의 이름을 결정할 필요가 없으므로, 결정해야 할 사항이 하나 줄어듭니다.
  3. 생태계 내에 명확한 관례를 만들어 사용자가 문서를 더 쉽게 찾을 수 있게 합니다.
  4. 서로 다른 도구 전반에서 일관성을 보장하므로 오류 메시지의 차이로 사용자가 혼란을 겪지 않게 합니다.

가상 환경 디렉터리에 다른 이름을 사용하십시오.

일관된 제안이 하나만 있다면 기능적으로 디렉터리 이름은 크게 중요하지 않습니다.

.venv라는 이름은 다음과 같은 이유로 선택되었습니다:

  1. 유효한 Python import 이름과 충돌하지 않습니다.
  2. 표준 라이브러리의 venv 모듈과 충돌하지 않습니다.
  3. Python 커뮤니티에서 이미 사용되고 있습니다.
  4. 일반적인 텍스트 편집기에서 자동 감지를 지원합니다.
  5. 일반적인 키보드 배열에서 보조 키 없이 입력할 수 있습니다.

도구 동작을 Python 버전에 결합하지 마십시오.

이 PEP는 설치 프로그램의 동작과 Python 버전 사이에 결합을 만듭니다.

이는 설치 도구의 동작 변경에 이미 사용되고 있는 출시 메커니즘입니다. 예를 들어 Python 3.11의 pip은 패키지 메타데이터를 구문 분석하고 가져올 때 pkg_resources 대신 importlib.metadata를 사용하며, 휠을 압축 해제할 경로를 가져올 때 distutils.sysconfig 대신 sysconfig을 사용합니다.

이러한 사례와의 차이점은 최종 사용자에게 대체로 투명하도록 설계되었다는 점입니다. 이 PEP는 최종 사용자에게 투명하지 않고 사용자가 조치를 취해야 하는 동작 변경을 제안합니다.

이 방식의 주요 이점은 재배포자가 새로운 Python 버전에 맞춰 도구를 제때 조정할 수 있게 하고, 생태계 전반에서 변경을 적용할 명확하고 일관된 시점을 제공한다는 것입니다. 또한 기본 동작이 기본적으로 가상 환경을 일관되게 요구하게 될 시점에 대한 명확한 기한을 설정합니다(Python 3.12가 수명 종료되는 시점).

이 접근 방식의 주요 문제는 사용자가 새로운 Python 버전으로 업그레이드할 때 동작 변경을 강제한다는 점이며, 이는 새로운 Python 버전의 도입을 저해할 수 있습니다. 그러나 이는 기존 사용자를 위한 마이그레이션/업그레이드이며, 마이그레이션/업그레이드를 위해 일부 변경이 필요하다는 것은 일반적으로 예상되는 사항입니다.

이 PEP의 작성자는 기한을 정하고 생태계 전반에 이를 일관되게 적용하는 이점이 사용자가 업그레이드할 때 모범 사례를 강제하는 데 따른 단점보다 크다고 생각합니다.

미해결 문제

없음.