Pyenv - 간단한 파이썬 버전 관리 도구
(github.com/pyenv)- 여러 버전의 Python 사이를 쉽게 전환할 수 있게 해줌
- 단순하고, 눈에 띄지 않으며, 잘 동작하는 단일 목적의 UNIX 전통 도구를 따름
- 이 프로젝트는 rbenv와 ruby-build에서 분기되어 Python에 맞게 수정됨
pyenv가 하는 일
- 사용자 기반으로 전역 Python 버전 변경 가능.
- 프로젝트별 Python 버전 지원.
- 환경 변수를 사용하여 Python 버전 오버라이드 가능.
- 한 번에 여러 버전의 Python 명령을 검색할 수 있음. tox를 사용하여 Python 버전 간에 테스트하는 데 유용함.
pyenv가 하지 않는 일...
- Python 자체에 의존하지 않음. pyenv는 순수 쉘 스크립트로 만들어짐.
- 쉘에 로드될 필요가 없음. 대신,
PATH에 디렉토리를 추가하는 shim 접근 방식을 사용함. - virtualenv 관리하지 않음. 물론, 사용자가 직접 virtualenv를 생성하거나 pyenv-virtualenv를 사용하여 자동화할 수 있음.
작동 원리
- pyenv는
PATH에 주입된 shim 실행 파일을 사용하여 Python 명령을 가로채고, 애플리케이션이 지정한 Python 버전을 결정한 후, 해당 Python 설치로 명령을 전달함.
PATH 이해하기
python이나pip같은 명령을 실행할 때, 운영 체제는PATH환경 변수에 있는 디렉토리 목록에서 해당 이름의 실행 파일을 찾음.
Shims 이해하기
- pyenv는
PATH의 맨 앞에 shims 디렉토리를 삽입함. rehashing 과정을 통해, 모든 설치된 Python 버전의 모든 Python 명령에 대해 shims를 유지함.
Python 버전 선택 이해하기
- shim을 실행할 때, pyenv는 다음 소스에서 순서대로 Python 버전을 읽어서 사용함:
PYENV_VERSION환경 변수(지정된 경우).- 현재 디렉토리의 애플리케이션별
.python-version파일(있는 경우). - 파일 시스템의 루트에 도달할 때까지 각 부모 디렉토리를 검색하여 찾은 첫 번째
.python-version파일(있는 경우). - 전역
$(pyenv root)/version파일.
Pyenv가 제공하는 Python 설치 위치 찾기
- pyenv가 결정한 Python 버전에 따라 명령을 해당 Python 설치로 전달함.
- 각 Python 버전은
$(pyenv root)/versions아래 자체 디렉토리에 설치됨.
사용법
추가 Python 버전 설치
pyenv install을 사용하여 추가 Python 버전을 설치함.
최신 버전으로 자동 해결
uninstall을 제외한 모든 Pyenv 하위 명령은 최신 버전으로 전체 접두사를 자동으로 해결함.
확장 지원이 있는 Python 버전
- 특정 환경에서 지원을 추가하기 위해 사용자 제공 패치를 적용하는 Python 릴리스가 있음.
Python 버전 간 전환
- Pyenv가 설치한 Python을 사용하려면 다음 명령 중 하나를 실행함:
pyenv shellpyenv localpyenv global
Python 버전 제거
- 시간이 지남에 따라
$(pyenv root)/versions디렉토리에 Python 버전이 쌓임. - 오래된 Python 버전을 제거하려면
pyenv uninstall을 사용함.
기타 작업
- 모든 사용 가능한 하위 명령 목록을 보려면
pyenv commands를 실행함.
pyenv 제거
- Pyenv를 임시로 비활성화하거나 시스템에서 제거하기 쉬움.
Pyenv 플러그인
- 플러그인을 사용하여 Pyenv의 기능을 간단하고 유연하며 유지 관리 가능한 방식으로 확장하고 사용자 정의할 수 있음.
고급 구성
- Pyenv의 동작을 제어하는 환경 변수가 있음.
개발
- Pyenv 소스 코드는 GitHub에서 호스팅됨.
- Bats를 사용하여 테스트를 실행함.
GN⁺의 의견
- pyenv는 다양한 Python 버전을 관리하는 데 매우 유용한 도구임. 특히 여러 프로젝트에서 다른 버전의 Python을 사용해야 하는 개발자에게 도움이 됨.
- 이 도구는 Python 자체에 의존하지 않고 순수 쉘 스크립트로 구성되어 있어, Python이 설치되지 않은 시스템에서도 설치와 관리가 가능함.
- pyenv는 virtualenv를 직접 관리하지 않지만, pyenv-virtualenv 플러그인을 통해 virtualenv 관리를 자동화할 수 있어 편리함.
- 설치 및 사용법이 상대적으로 간단하므로, Python 버전 관리가 필요한 초급 소프트웨어 엔지니어도 쉽게 접근할 수 있음.
- pyenv와 유사한 기능을 제공하는 다른 도구로는
conda가 있으며, 특히 데이터 과학과 머신러닝 분야에서 널리 사용됨.conda는 패키지 관리와 환경 관리를 함께 제공하므로, 이러한 기능이 필요한 사용자에게 추천할 수 있음. - pyenv를 도입할 때는 시스템에 여러 버전의 Python이 설치되어 있을 경우 경로 충돌을 피하기 위해 주의가 필요함. pyenv를 사용함으로써 얻는 이점은 버전 관리의 용이성이지만, 잘못된 설정은 시스템의 기본 Python 경로를 방해할 수 있음.
asdf 를 최상위에 설정해두고 https://asdf-vm.com/
프로젝트 별로는 local로 구성하기도 하고, 컨테이너를 이용하기도하고...
새로운 환경 구성 + 메니징 하는게 많이 나와서 잘안쓰고 있긴하네요.. ㅎㅎㅎㅎ
rbenv, pyenv, nodenv 이런 것들이 계속 생기니까 결국 anyenv란 것도 생겼죠.ㅎㅎ
https://github.com/anyenv/anyenv
Hacker News 의견
-
pyenv 사용에 대한 경고
- pyenv는 Python을 사용자의 기계에서 컴파일하는 큰 단점이 있음.
- 이 상황에서 발생할 수 있는 실패 모드가 매우 많음.
- pyenv는 초보자가 Python 패키징 문제를 해결하기 위한 도구가 아니라, 설정을 표준화하기 위한 전문가용 도구임.
- 사용자들이 pyenv로 인한 문제를 겪고 있지만, 그것을 인지하지 못하는 경우가 많음.
-
Python 프로그래머의 고통
- Python 프로그래머들이 겪는 불필요한 어려움에 대한 놀라움.
- 여러 버전의 Python을 설치해야 하는 것은 비이성적임.
- Python 프로그램이 어디서나 작동하는 개념이 실용적이지 않음.
- 모든 것이 취약하여 정확한 언어 버전 없이는 작동하지 않음.
- 의존성 문제가 심각하여 패키지 관리자의 관리자가 필요한 상황임.
-
Python 프로그램을 안정적으로 유지하는 도구
- Python 프로그램이 처음 작성했을 때와 동일하게 작동하도록 보장하는 도구들의 목록.
- requirements.txt, pip, pipenv, pyenv, virtualenv 등 다양한 도구들이 있음.
-
Mise 도구 소개
- Rust로 작성된 Mise는 asdf와 같지만 더 빠르고 기본적으로 shims가 없음.
- 런타임을 병렬로 설치하고 필요한 플러그인을 다운로드함.
- asdf나 pyenv보다 나은 도구로 사용될 수 있음.
-
ASDF의 장점
- ASDF는 Python뿐만 아니라 Rust, Go, Node 등 여러 언어와 다양한 도구들을 지원함.
-
pyenv 사용 경험 공유
- pyenv 사용 초기에는 문제가 없었지만, 여러 버전의 Python을 설치한 후 문제가 발생함.
- pyenv 대신 python.org에서 Python을 다운로드하고
python<version> -m venv /my/virtual/env를 사용하여 가상 환경을 관리하는 것이 더 안정적임.
-
개인적인 Python 관리 스택
- pyenv로 Python 버전을 관리하고, 각 프로젝트마다 venv를 사용하여 새로운 가상 환경을 생성함.
- 프로젝트 초기화와 의존성 관리는 Poetry를 사용함.
- Dropbox를 사용하는 경우 .venv 폴더를 무시 목록에 추가함.
- Pyenv는 Ubuntu에 필요한 모든 의존성을 수집한 후 잘 작동함.
-
Mise를 사용한 런타임 의존성 관리
- Python, Node, Ruby, Terraform 등 대부분의 런타임 의존성을 동일한 방식으로 처리하는 mise 사용.
- Python 가상 환경도 활성화할 수 있음.
-
macOS 워크플로우 공유
- python.org에서 필요한 Python 바이너리를 다운로드하고, virtualenv를 사용하여 가상 환경을 설정함.
- pyproject.toml과 pip-compile을 사용하여 프로젝트 관리.
- Python 프로젝트 관리 공간에서 많은 변화가 있었지만, 이 워크플로우로 모든 것을 간과할 수 있었음.