목차
개요
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
'Language > Python' 카테고리의 다른 글
[SQLAlchemy] Raw SQL (1) | 2023.10.19 |
---|---|
LangChain으로 크롤링을 해보자. (0) | 2023.10.17 |
dictionary를 dataclass로 만들고 다시 class로 정의하기 (0) | 2023.09.17 |
[SQLAlchemy] SQL Compilation Caching (0) | 2023.08.13 |
[Python] Selenium Proxy를 이용한 Tor 사용하기 (0) | 2023.07.09 |