19P by neo 1달전 | favorite | 댓글 7개
  • 여러 버전의 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 버전을 읽어서 사용함:
    1. PYENV_VERSION 환경 변수(지정된 경우).
    2. 현재 디렉토리의 애플리케이션별 .python-version 파일(있는 경우).
    3. 파일 시스템의 루트에 도달할 때까지 각 부모 디렉토리를 검색하여 찾은 첫 번째 .python-version 파일(있는 경우).
    4. 전역 $(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 경로를 방해할 수 있음.

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

이 상황에서 발생할 수 있는 실패 모드가 매우 많음.

여기가 너무 고통스러운 지점 같아요.

conda 는 주의하실게 일정규모 기업에서는
유료입니다.
회사가 작아도 원청 규모가 크면 납품하기 애매해요

conda 자체는 bsd 로 무료지만 저장소 및 패키지 라이센스 잘 보셔야 해요.

asdf 를 최상위에 설정해두고 https://asdf-vm.com/

프로젝트 별로는 local로 구성하기도 하고, 컨테이너를 이용하기도하고...

새로운 환경 구성 + 메니징 하는게 많이 나와서 잘안쓰고 있긴하네요.. ㅎㅎㅎㅎ

저도 딱 그렇게 씁니다.
ㅎㅎㅎ 개인적으로 pyenv는 약간 구닥다리가 된 느낌이 있습니다.