[Final] PEP 370 - Per user site-packages directory

원문 링크: PEP 370 - Per user site-packages directory

상태: Final 유형: Standards Track 작성일: 11-Jan-2008

PEP 370 – 사용자별 site-packages 디렉터리

작성자: Christian Heimes 상태: Final 유형: Standards Track 생성일: 2008년 1월 11일 Python 버전: 2.6, 3.0

개요 (Abstract)

이 PEP는 사용자들이 자신의 홈 디렉터리에 Python 패키지를 로컬로 설치할 수 있도록, 사용자별 site-packages 디렉터리를 새로 제안합니다.

도입 배경 (Rationale)

현재 Python 버전에는 사용자 홈 디렉터리에 패키지를 설치하는 통일된 방법이 없습니다 (Mac Framework 빌드 제외). 사용자들은 시스템 관리자에게 패키지 설치 또는 업데이트를 요청하거나, Virtual Python, Working Env, Virtual Env와 같은 다양한 임시 해결책(workaround) 중 하나를 사용해야 했습니다.

이 PEP의 목표는 기존 도구들을 대체하거나 Python의 격리된 설치를 구현하는 것이 아닙니다. 단지 각 사용자를 위한 추가적인 site-packages 디렉터리라는 가장 일반적인 사용 사례를 구현하는 것입니다.

이 기능은 PYTHONPATH 환경 변수를 사용하여 구현할 수 없습니다. 환경 변수는 단순히 sys.path의 시작 부분에 새 디렉터리를 추가하지만, 해당 디렉터리 내의 .pth 파일을 파싱(parse)하지 않습니다. 여러 애플리케이션과 Python egg 파일에는 완전히 기능을 갖춘 site-packages 경로가 필요합니다.

사양 (Specification)

site 디렉터리 (site-packages)

sys.path에 있는 디렉터리입니다. 일반 디렉터리와 달리, 이 디렉터리 내의 .pth 파일도 처리됩니다.

사용자 site 디렉터리 (user site directory)

사용자의 홈 디렉터리 내에 있는 site 디렉터리입니다. 사용자 site 디렉터리는 특정 Python 버전에 종속됩니다. 경로는 주 버전(major)과 부 버전(minor)만을 포함하는 버전 번호를 포함합니다.

  • Unix (Mac OS X 포함): ~/.local/lib/python2.6/site-packages
  • Windows: %APPDATA%/Python/Python26/site-packages

사용자 데이터 디렉터리 (user data directory)

일반적으로 사용자 site 디렉터리의 상위 디렉터리입니다. config 파일, 문서, 이미지 및 번역과 같이 Python 버전에 특화된 데이터를 위한 공간입니다.

  • Unix (Mac OS X 포함): ~/.local/lib/python2.6
  • Windows: %APPDATA%/Python/Python26

사용자 기본 디렉터리 (user base directory)

사용자의 홈 디렉터리 내에 위치합니다. 사용자 site 디렉터리와 사용자 config 디렉터리가 이 기본 디렉터리 안에 있습니다. 일부 시스템에서는 이 디렉터리가 타사 앱과 공유될 수 있습니다.

  • Unix (Mac OS X 포함): ~/.local
  • Windows: %APPDATA%/Python

사용자 스크립트 디렉터리 (user script directory)

바이너리 및 스크립트 파일을 위한 디렉터리입니다. 여러 Python 버전에서 공유되며, 스크립트의 대상 디렉터리입니다.

  • Unix (Mac OS X 포함): ~/.local/bin
  • Windows: %APPDATA%/Python/Scripts

Windows 관련 사항

Windows에서는 Application Data 디렉터리 (일명 APPDATA)가 애플리케이션 데이터를 위한 가장 적절한 장소로 선택되었습니다. Microsoft는 소프트웨어가 USERPROFILE에 쓰지 않도록 권장하며, “내 문서” 역시 애플리케이션 데이터에 적합하지 않습니다. 코드는 Win32 API를 쿼리하는 대신 %APPDATA% 환경 변수를 사용합니다.

애플리케이션 데이터 디렉터리는 로밍 프로필(roaming profile)의 일부입니다. 도메인 로그인이 있는 네트워크에서는 애플리케이션 데이터가 중앙 서버에서 복사되거나 복사될 수 있습니다. 이는 로그인 및 로그오프 속도를 저하시킬 수 있습니다. 사용자들은 PYTHONUSERBASE를 “%HOMEDRIVE%%HOMEPATH%Applicata Data”와 같은 값으로 설정하여 데이터를 서버에 유지할 수 있습니다. 더 자세한 정보는 로컬 관리자에게 문의해야 합니다.

Unix 관련 사항

Unix에서는 ~/.python보다 ~/.local이 선택되었는데, 이는 이 디렉터리가 /usr/local과 유사하게 이미 다른 여러 프로그램에서 사용되고 있기 때문입니다.

Mac OS X 관련 사항

Mac OS X에서도 Python은 ~/.local 디렉터리를 사용합니다. Python의 Framework 빌드는 ~/Library/Python/2.6/site-packages를 추가 검색 경로로 포함합니다.

구현 (Implementation)

site 모듈에 새로운 메서드 adduserpackage()가 추가되어 적절한 디렉터리를 검색 경로에 추가합니다. Python이 시작될 때 디렉터리가 존재하지 않으면 추가되지 않습니다. 그러나 사용자 site 디렉터리와 사용자 base 디렉터리의 위치는 distutils를 위한 내부 변수에 저장됩니다.

사용자 site 디렉터리는 시스템 site 디렉터리보다 먼저 추가되지만, Python의 검색 경로와 PYTHONPATH 다음입니다. 이 설정은 사용자가 시스템 관리자가 설치한 패키지보다 다른 버전의 패키지를 설치할 수 있도록 허용하지만, 사용자가 실수로 표준 라이브러리(stdlib) 모듈을 덮어쓰는 것을 방지합니다. PYTHONPATH를 사용하면 stdlib 모듈을 여전히 덮어쓸 수 있습니다.

보안상의 이유로, 유효 사용자 ID 또는 그룹 ID가 프로세스 UID/GID와 같지 않은 경우 사용자 site 디렉터리는 sys.path에 추가되지 않습니다. 이는 suid 애플리케이션에 대한 코드 주입에 대한 추가적인 장벽입니다. 그러나 Python suid 스크립트는 항상 -E-s 옵션을 사용해야 하며, 그렇지 않으면 사용자가 자신의 코드를 몰래 삽입할 수 있습니다.

사용자 site 디렉터리는 새로운 옵션 -s 또는 환경 변수 PYTHONNOUSERSITE를 통해 비활성화할 수 있습니다. 이 기능은 site.ENABLE_USER_SITEFalse로 설정하여 전역적으로 비활성화할 수 있습니다. 이는 site.py를 편집하여 설정해야 하며, sitecustomize.py 또는 그 이후에는 변경할 수 없습니다.

사용자 base 디렉터리의 경로는 환경 변수 PYTHONUSERBASE로 덮어쓸 수 있습니다. PYTHONUSERBASE가 설정되지 않았거나 비어 있는 경우 기본 위치가 사용됩니다.

distutils.command.install (setup.py install)은 사용자 site 디렉터리에 패키지를 설치하기 위한 새로운 인자 --user를 얻습니다. 필요한 디렉터리는 필요할 때 생성됩니다.

distutils.command.build_ext (setup.py build_ext)는 새로운 인자 --user를 얻으며, 이는 사용자 base 디렉터리의 include/lib/ 디렉터리를 헤더 파일 및 라이브러리 검색 경로에 추가합니다. 또한 lib/ 디렉터리를 rpath에 추가합니다.

site 모듈은 사용자 base 또는 사용자 site 디렉터리의 경로를 표준 출력으로 인쇄하기 위한 두 가지 인자 --user-base--user-site를 얻습니다. 이 기능은 스크립팅을 위한 것으로, 예를 들어 ./configure --prefix $(python2.5 -m site --user-base)와 같이 사용될 수 있습니다.

distutils.sysconfigsite의 private 변수에 접근하는 메서드를 얻게 될 것입니다. (아직 구현되지 않음)

Windows 업데이터도 업데이트해야 합니다. 이는 새 Explorer 창에서 사용자 site 디렉터리를 여는 메뉴 항목을 생성해야 합니다.

하위 호환성 (Backwards Compatibility)

확정되지 않음 (TBD)

참조 구현 (Reference Implementation)

참조 구현은 버그 트래커에서 확인할 수 있습니다.

이 문서는 퍼블릭 도메인에 공개되었습니다.

참고 자료 (References)

  • Virtual Python
  • Working Env
  • Virtual Env
  • 참조 구현 (reference implementation)
  • MSDN: CSIDL
  • 사용자별 site-packages 디렉터리에 대한 초기 제안
  • ~/.local/ 제안
  • APPDATA 토론
  • 보안 문제 및 -s 옵션
  • bin 디렉터리에 대한 논의
  • freedesktop.org XGD basedir 사양에서 ~/.local 언급
  • Mac용 ~/.localusercustomize 파일
  • Windows의 로밍 프로필

⚠️ 알림: 이 문서는 AI를 활용하여 번역되었으며, 기술적 정확성을 보장하지 않습니다. 정확한 내용은 반드시 원문을 확인하시기 바랍니다.

Comments