GN⁺: 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 shell
-
pyenv local
-
pyenv 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 프로젝트 관리 공간에서 많은 변화가 있었지만, 이 워크플로우로 모든 것을 간과할 수 있었음.