PEP 370 – 사용자별 site-packages 디렉터리
- Author:
- Christian Heimes <christian at python.org>
- Status:
- Final
- Type:
- Standards Track
- Created:
- 11-Jan-2008
- Python-Version:
- 2.6, 3.0
- Post-History:
Table of Contents
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 사용자가 자신의 홈 디렉터리에 Python 패키지를 로컬로 설치할 수 있도록 새로운 사용자별 site-packages 디렉터리를 제안합니다.
배경
현재 Python 버전에는 사용자의 홈 디렉터리에 패키지를 설치하는 통합된 방법이 없습니다(Mac 프레임워크 빌드는 제외합니다). 사용자는 시스템 관리자에게 패키지를 대신 설치하거나 업데이트해 달라고 요청하거나, Virtual Python [1], Working Env [2] 또는 Virtual Env [3]와 같은 여러 해결 방법 중 하나를 사용해야 합니다.
이 PEP의 목표는 도구를 대체하거나 Python을 격리하여 설치하는 기능을 구현하는 것이 아닙니다. 각 사용자에게 추가 site-packages 디렉터리를 제공하는 가장 일반적인 사용 사례만 구현합니다.
이 기능은 환경 변수 PYTHONPATH를 사용하여 구현할 수 없습니다. 환경 변수는 새 디렉터리를 sys.path의 시작 부분에 삽입할 뿐이며, 해당 디렉터리의 pth 파일을 구문 분석하지 않습니다. 여러 애플리케이션과 Python egg에는 완전한 site-packages 경로가 필요합니다.
사양
site 디렉터리 (site-packages)
sys.path에 있는 디렉터리입니다. 일반 디렉터리와 달리 해당 디렉터리의 pth 파일도 처리됩니다.
사용자 site 디렉터리
사용자의 홈 디렉터리 안에 있는 site 디렉터리입니다. 사용자 site 디렉터리는 Python 버전에 따라 다릅니다. 경로에는 버전 번호가 포함됩니다(주 버전과 부 버전만 포함합니다).
- Unix (Mac OS X 포함)
~/.local/lib/python2.6/site-packages- Windows
%APPDATA%/Python/Python26/site-packages
사용자 데이터 디렉터리
일반적으로 사용자 site 디렉터리의 상위 디렉터리입니다. 구성 파일, 문서, 이미지 및 번역과 같은 Python 버전별 데이터를 저장하는 용도입니다.
- Unix (Mac 포함)
~/.local/lib/python2.6- Windows
%APPDATA%/Python/Python26
사용자 기본 디렉터리
사용자의 홈 디렉터리 안에 있습니다. 사용자 사이트와 사용자 설정 디렉터리는 기본 디렉터리 안에 있습니다. 일부 시스템에서는 이 디렉터리를 타사 앱과 공유할 수 있습니다.
- 유닉스(맥 포함)
~/.local- Windows
%APPDATA%/Python
사용자 스크립트 디렉터리
바이너리와 스크립트를 위한 디렉터리입니다. [10] Python 버전 간에 공유되며 스크립트의 대상 디렉터리입니다.
- 유닉스(맥 포함)
~/.local/bin- Windows
%APPDATA%/Python/Scripts
Windows 참고 사항
Windows에서는 Application Data 디렉터리(즉, APPDATA)가 애플리케이션 데이터를 저장하기에 가장 적합한 위치이기 때문에 선택되었습니다. Microsoft는 소프트웨어가 USERPROFILE에 쓰지 않도록 권장하며 [5] My Documents도 애플리케이션 데이터에 적합하지 않습니다. [8] 이 코드는 Win32 API를 조회하지 않고 대신 환경 변수 %APPDATA%를 사용합니다.
애플리케이션 데이터 디렉터리는 로밍 프로필의 일부입니다. 도메인 로그인을 사용하는 네트워크에서는 애플리케이션 데이터가 중앙 서버와 복사될 수 있습니다. 이로 인해 로그인 및 로그아웃이 느려질 수 있습니다. 사용자는 예를 들어 PYTHONUSERBASE를 값 “%HOMEDRIVE%%HOMEPATH%Applicata Data”로 설정하여 서버에 데이터를 유지할 수 있습니다. 사용자는 자세한 정보를 현지 관리자에게 문의해야 합니다. [13]
유닉스 참고 사항
유닉스에서는 ~/.local이 /usr/local과 유사하게 여러 다른 프로그램에서 이미 사용되고 있기 때문에 ~/.python보다 선호되어 선택되었습니다. [7] [11]
Mac OS X 참고 사항
Mac OS X에서도 Python은 ~/.local 디렉터리를 사용합니다. [12] Python의 프레임워크 빌드에는 추가 검색 경로로 ~/Library/Python/2.6/site-packages가 포함됩니다.
구현
site 모듈에는 적절한 디렉터리를 검색 경로에 추가하는 새 메서드 adduserpackage()가 추가됩니다. Python이 시작될 때 디렉터리가 존재하지 않으면 추가되지 않습니다. 그러나 사용자 사이트 디렉터리와 사용자 기본 디렉터리의 위치는 distutils용 내부 변수에 저장됩니다.
사용자 사이트 디렉터리는 시스템 사이트 디렉터리보다 먼저 추가되지만 Python의 검색 경로와 PYTHONPATH보다는 나중에 추가됩니다. 이 설정을 사용하면 사용자가 시스템 관리자와 다른 버전의 패키지를 설치할 수 있지만, 사용자가 실수로 표준 라이브러리 모듈을 덮어쓰는 것은 방지됩니다. 표준 라이브러리 모듈은 여전히 PYTHONPATH로 덮어쓸 수 있습니다.
보안상의 이유로 유효 사용자 ID나 그룹 ID가 프로세스의 uid/gid와 같지 않은 경우, 사용자 사이트 디렉터리는 sys.path에 추가되지 않습니다 [9]. 이는 suid 앱에 대한 코드 주입을 막는 추가적인 장벽입니다. 그러나 Python suid 스크립트는 -E와 -s 옵션을 항상 반드시 사용해야 합니다. 그렇지 않으면 사용자가 자신의 코드를 몰래 끼워 넣을 수 있습니다.
사용자 사이트 디렉터리는 새로운 옵션 -s나 환경 변수 PYTHONNOUSERSITE로 억제할 수 있습니다. 이 기능은 site.ENABLE_USER_SITE를 False 값으로 설정하여 전역적으로 비활성화할 수 있습니다. 이는 site.py를 편집하여 설정해야 합니다. 이는 in sitecustomize.py나 그 이후에는 변경할 수 없습니다.
사용자 베이스 디렉터리의 경로는 환경 변수 PYTHONUSERBASE로 재정의할 수 있습니다. PYTHONUSERBASE가 설정되지 않았거나 비어 있을 때는 기본 위치가 사용됩니다.
distutils.command.install (setup.py install)은 사용자 사이트 디렉터리에 패키지를 설치하기 위한 새로운 인자 --user를 받습니다. 필요한 디렉터리는 필요에 따라 생성됩니다.
distutils.command.build_ext (setup.py build_ext)는 헤더 파일과 라이브러리 검색 경로에 사용자 베이스 디렉터리의 include/ 및 lib/ 디렉터리를 추가하는 새로운 인자 --user를 갖습니다. 또한 lib/ 디렉터리를 rpath에 추가합니다.
site 모듈은 사용자 베이스 또는 사용자 사이트 디렉터리의 경로를 표준 출력으로 출력하기 위한 두 개의 인자 --user-base와 --user-site를 갖습니다. 이 기능은 스크립팅을 위한 것으로, 예를 들어 ./configure --prefix $(python2.5 -m site --user-base)와 같습니다.
distutils.sysconfig는 site의 비공개 변수에 접근하기 위한 메서드를 갖게 될 것입니다. (아직 구현되지 않음)
Windows 업데이트 프로그램도 함께 업데이트되어야 합니다. 새 탐색기 창에서 사용자 사이트 디렉터리를 여는 메뉴 항목을 만들어야 합니다.
하위 호환성
TBD
참조 구현
참조 구현은 버그 트래커에서 확인할 수 있습니다. [4]
Copyright
This document has been placed in the public domain.
References
[6] Initial suggestion for a per user site-packages directory https://mail.python.org/archives/list/python-dev@python.org/message/V23CUKRH3VCHFLV33ADMHJSM53STPA7I/