본문으로 바로가기

pyenv를 알아보자.

category Language/Python 2023. 9. 18. 02:20
728x90
반응형

목차


    개요

    python으로 개발하다 보면 python version이 프로젝트 별로 상이할 때가 존재한다. 어떤 Project에서는 python 2.x 어떤 Project에서는 python 3.x가 필요하게 되는 상황들이다.

     

    pyenv를 알기 전까지는 위와 같은 상황이 있을때 brew를 이용하여 특정 python version을 다시 설치하고 해당 python 경로를. zshrc에 세팅함으로써 다뤄왔기 때문에 Python Version을 변경하여 무언가를 테스트하려고 할 때는 상당히 귀찮은 과정이었다.

     

    그러나 Python 3.8.x ~ 3.9.x 사이를 많이 사용해 왔기 때문에 version끼리 호환되지 않는 현상이나 library가 존재하는 상황도 마주 치친 않았던 것 같다.

     

    문제는 Python 3.10을 다룰 때부터였다. python 3.10을 다룰 때부터는 적용해둔 typing이 제대로 먹히지 않는 현상이 종종 있다거나 특정 library가 의존하는 python version이 3.9 이하터이기 때문에 이를 유연하게 변경하는데 애를 먹었다.

     

    이 글은 필자가 pyenv를 사용하면서 파악해두었던 내용을 cheet sheet 형태로 기록하기 위함에 있다.

     

    환경

    macOS Ventura 13.5 버전에서 pyenv를 사용했다. 그리고 전역적으로 설치된 python 환경은 다음과 같은 상태이다.

    /opt/homebrew/bin/python3

     

     

    pyenv usage

    Installation

    설치는 간단하다.

    ╰─$ brew install pyenv

    주의할점은 사용하고 있는 shell에 pyenv가 환경변수로 설정되어 있는지 여부인 듯하다. 필자는 zsh를 사용하고 있는데 pyenv를 설치하고 난 후 .zshrc 파일에 다음과 같이 pyenv를 setting 하는 구문을 심어놨다.

    # ~/.zshrc
    ...
    export PYENV_ROOT="$HOME/.pyenv"
    command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
    eval "$(pyenv init -)"
    ...

     

    설치 가능한 python version 확인하기

    pyenv를 사용하면 pyenv를 통해 python versions을 제어할 수 있다. 이 의미는 pyenv를 통해 python version을 지정하여 설치할 수 있다는 뜻이다. 다음과 같은 명령을 입력하면 pyenv를 통해 설치할 수 있는 python version이 리스트업 된다.

    ╰─$ pyenv install --list
    ...
      3.8.0
      3.8-dev
      3.8.1
      3.8.2
      3.8.3
      3.8.4
      3.8.5
    ...

     

    python 설치하기

    설치할 수 있는 python version을 확인했으면 다음과 같은 명령어를 이용하여 python version을 설치할 수 있다.

    ╰─$ pyenv install 3.8.18
    python-build: use openssl@1.1 from homebrew
    python-build: use readline from homebrew
    Downloading Python-3.8.18.tar.xz...
    -> https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tar.xz
    Installing Python-3.8.18...
    python-build: use tcl-tk from homebrew
    python-build: use readline from homebrew
    python-build: use zlib from xcode sdk
    Installed Python-3.8.18 to /Users/jako/.pyenv/versions/3.8.18

    필자 기준에서는 설치하는데 시간이 꽤 걸렸다.

     

     

    python을 설치하면 어디에 위치하는 곳

    설치된 python은 다음과 같은 경로에 위치한다.

    ╰─$ ls -l $(pyenv root)/versions
    total 0
    drwxr-xr-x  6 jako  staff  192  9 13 19:35 3.10.11
    drwxr-xr-x  6 jako  staff  192  6  4 23:41 3.8.16

     

     

    설치된 python version 확인하기

    위의 방법처럼 "경로"를 통해 특정 python version 설치된 것을 확인할 수도 있지만 "명령어"를 통해서도 확인할 수 있다.

    ╰─$ pyenv versions
      system
      3.8.18
    * 3.9.12



    전역적으로 사용할 python version 선택하기

    여기서 "전역"은 말 그대로 "global"하게 사용할 python version을 뜻한다. 물론 "local"이라는 개념으로도 사용할 수 있다. 이는 후술 하겠다.

     

    "전역"적으로 사용할 python version을 선택하는 명령어는 다음과 같다.

    pyenv global 3.8.18

    위와 같이 명령어를 실행하면 pyenv verions 명령을 통해 현재 선택된 python version을 표시해 준다.

    ╰─$ pyenv versions
      system
      3.8.16
    * 3.8.18
      3.10.11

     

    local로 사용하기

    여기서 "로컬"이란 특정 directory 범위 안이라고 정의할 수 있다. 예를 들어 project_a라는 디렉터리 안에서 python을 실행하면 pyenv의 global에 잡힌 python versions이 실행된다.

    ╭─jako@prompt-mini ~/private/opt-repo/project_a
    ╰─$ python
    Python 3.8.18 (default, Sep 18 2023, 02:09:22)
    [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

    만약 project_a 안에서 3.8.18이 아닌 3.10.11 version을 사용하고 싶다면 어떻게 해야 될까? 이에 대한 답은 "pyenv local"이라는 명령을 사용하는 것이다. 

    ╭─jako@prompt-mini ~/private/opt-repo/project_a
    ╰─$ pyenv local 3.10.11
    ╭─jako@prompt-mini ~/private/opt-repo/project_a
    ╰─$ ls -a
    .               ..              .python-version

    명령어의 결과를 통해  확인할 수 있다시피 "pyenv local [PYTHON_VERSION]"을 사용하게 되면. python-version이라는 파일이 생성된다. 이 파일에는 다음과 같은 내용이 기재되어 있다.

    ╰─$ cat .python-version
    3.10.11

    이제 python을 실행하면 python 3.10.11이 실행된다.

    ╭─jako@prompt-mini ~/private/opt-repo/project_a
    ╰─$ python
    Python 3.10.11 (main, Sep 13 2023, 19:34:24) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

    검증을 위해 외부로 이동해서 python을 실행해 보자.

    ╭─jako@prompt-mini ~/private/opt-repo
    ╰─$ python
    Python 3.8.18 (default, Sep 18 2023, 02:09:22)
    [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

    pyenv의 local을 어떻게 사용할 수 있는지 이해했다.

     

    설치된 version 삭제하기

    pyenv에 설치된 특정 python version을 삭제하려면 다음과 같이 수행하자.

    ╭─jako@prompt-mini ~/private/opt-repo
    ╰─$ pyenv uninstall 3.8.18
    pyenv: remove /Users/jako/.pyenv/versions/3.8.18? [y|N] y
    pyenv: 3.8.18 uninstalled
    ╭─jako@prompt-mini ~/private/opt-repo
    ╰─$ pyenv versions
    pyenv: version `3.8.18' is not installed (set by /Users/jako/.pyenv/version)
      system
      3.8.16
      3.10.11

     

    728x90
    반응형