pyenv를 이용하여 여러 개의 Python 버전 관리하기(for. MacOS M1)

김재민·2023년 6월 12일
4

개요

: 나는 MacOS(M1) 에서 프로젝트 별 여러개의 파이썬 버전을 사용 중이다. 그래서 pyenv를 이용하여 여러개의 파이썬 버전을 관리 하고 있다. 얼마전 노트북 포멧을 진행하여 개발환경 세팅을 다시 하는 김에 블로그에 정리해 본다.


pyenv 개념

: 아래 이미지 처럼 global, local, shell 각 위치에 python 버전을 구분해서 사용 할 수 있다. python 은 shell > local > global > system 우선 순위로 적용 된다. 예를 들어, python 3.8 버전을 global로 설정하고 특정 디렉토리에서 python 3.10 을 local 로 설정 할 경우 해당 디렉토리에서는 global 보다 local 에 설정해둔 python 3.10 을 우선 인식한다.
(system의 경우 MacOS에 기본으로 설치 되어 있는 python 이라고 생각 하면 된다.)

출처: https://realpython.com/intro-to-pyenv/#using-the-pyenv-installer


pyenv-virtualenv 개념과 사용하는 이유

: 예상하는 것 처럼 pyenv로 설치한 python 버전의 가상환경을 사용할 수 있도록 해준다. 예를 들어, pyenv install 명령어를 이용해서 python 3.8 버전을 설치 했을 때, python 3.8 버전에 대한 가상환경을 각 프로젝트 별로 여러 개 생성하여 패키지 충돌을 방지할 수 있다.


설치 및 사용 가이드

1. 빌드 종속성 설치

$ brew install openssl readline sqlite3 xz zlib

2. pyenv, pyenv-virtualenv 설치

# (이하 모두)My Mac M1
$ brew install pyenv
$ brew install pyenv-virtualenv

3. zshrc 설정

: 나는 zsh 을 기본 쉘로 사용하기 때문에 zshrc에 아래 내용을 추가한다.

# pyenv/bin 경로를 PATH 에 등록하여 pyenv를 어디에서도 사용 가능하도록 하기 위해 추가한다.
$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.zshrc

# pyenv 를 정상적으로 사용할 수 있도록 zshrc 에 init 명령어를 추가한다.
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc

# pyenv virtualenv 를 정상적으로 사용할 수 있도록 zshrc 에 init 명령어를 추가한다.
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc

# 활성화
source ~/.zshrc

4. 설치 가능한 python 버전 확인

$ pyenv install --list | grep  " 3\.[678910]"

5. python 3.9.17 설치 및 확인

: pyenv versions 명령어를 이용하면 pyenv로 설치 된 모든 python 버전을 확인할 수 있다. * 로 표시 된 부분이 현재 활성화 되어 있는 python 이다.

# 설치
$ pyenv install -v 3.9.17

# 설치 된 모든 파이썬 버전 확인
$ pyenv versions  # 또는 ls ~/.pyenv/versions/
* system (set by /Users/kimjaemin/.pyenv/version)
  3.9.17
  
# 최근 활성화 된 파이썬 버전 확인
$ pyenv version
system (set by /Users/kimjaemin/.pyenv/version)

# 삭제 할 때: pyenv uninstall 3.9.17

6. global 설정 및 테스트

: 위에서 설치한 python 3.9.17 버전을 global로 설정하여 사용할 수 있고, 정상 설치 여부를 확인하기 위해 test 할 수 있다.
python 3.9.17 버전을 global 로 설정하였기 때문에 어떤 디렉토리에서든 python -V 명령어를 사용하면 3.9.17 이 출력 되는 것을 볼 수 있다.

# python 3.9.17 을 global 로 선언
$ pyenv global 3.9.17

# pyenv 활성화 버전 확인
$ pyenv versions
  system
* 3.9.17 (set by /Users/kimjaemin/.pyenv/version)

# 현재 사용중인 python 버전 확인
$ python -V
Python 3.9.17

# python 테스트(엄청 오래 걸린다.)
$ python -m test 

7. local 설정 및 global 과 비교

: 이번에는 python 3.7.17 버전을 설치하여 특정 디렉토리에서 local 선언 후 global 과 비교해 보겠다.

# python 3.7.17 설치
$ pyenv install -v 3.7.17

# 특정 디렉토리 생성 및 이동
$ cd ~/Desktop && mkdir local_test/ && cd local_test

# pyenv 로 설치된 python 버전 확인
$ pyenv versions
  system
  3.7.17
* 3.9.17 (set by /Users/kimjaemin/.pyenv/version)

# 현재 python 활성화 버전 확인(아직 python 3.9.17 이 출력 돼야 정상이다.)
$ python -V 
Python 3.9.17

# local_test/ 디렉토리에서 pyenv local 등록
$ pyenv local 3.7.17

# 다시 한 번 python 버전 확인
$ python -V
Python 3.7.17

# 다른 디렉토리에서 python 버전 확인
$ cd ../ && python -V
Python 3.9.17

: 위와 같이 local_test/ 디렉토리에서 pyenv local 3.7.17 명령어를 사용하니까 해당 디렉토리에서만 python 버전이 3.7.17 로 활성화 된 것을 알 수 있다. 특정 디렉토리에서 pyenv local [파이썬버전] 명령어를 사용하면 해당 디렉토리에 .python-version 파일이 생긴다.

$ cd local_test/ && pwd && ls -al
/Users/kimjaemin/Desktop/local_test
total 8
drwxr-xr-x@ 3 kimjaemin  staff   96  6 13 01:29 .
drwx------+ 5 kimjaemin  staff  160  6 13 01:22 ..
-rw-r--r--@ 1 kimjaemin  staff    7  6 13 01:29 .python-version

$ cat .python-version
3.7.17

📍 pyenv-virtualenv 를 사용하기 전에

: 방금까지 pyenv 명령어로 global, local 수준에서 python 을 버전 별로 설치해 보았다. pyenv-virtualenv 에 대해 정리하기 전에 조금 더 이해하기 쉽게 가상환경을 사용하는 이유를 요약해보자.

만약, 방금 설치한 python 3.9.17 버전을 사용하는 A, B, C 프로젝트가 있다고 가정하자. 그렇다면, 세 프로젝트에서 설치한 모든 라이브러리는 아래 경로에 설치된다.

~/.pyenv/versions/3.9.17/lib/python3.9/site-packages

세 프로젝트 모두 flask 를 사용하지만 모두 다른 버전을 사용해야한다면, 저장 위치가 동일하므로 버전 충돌 이슈가 발생할 수 있다. 이런 이슈를 방지하기 위해 각 프로젝트 별로 같은 python 3.9.17 버전을 사용하지만 패키지 저장 디렉토리는 별도로 관리 하도록 지원하는 것이 pyenv-virtualenv 이다.

pyenv-virtualenv 를 이용하여 가상환경 만들기

: 특정 버전의 가상환경을 만들기 위해서는 pyenv 로 python 을 먼저 설치를 해놔야 한다. 나는 위에서 설치한 python 3.9.17 버전의 가상환경을 만들어 보겠다.

1. 가상환경 만들기

$ pyenv virtualenv 3.9.17 a_project_3_9_17
# $ pyenv virtualenv [파이썬버전] [프로젝트이름]

2. 가상환경 생성 확인

: pyenv versions 명령어로 확인해 보면, a_project_3_9_17 이라는 가상환경이 생긴 걸 확인할 수 있다.

$ pyenv versions
  system
  3.7.17
* 3.9.17 (set by /Users/kimjaemin/.pyenv/version)
  3.9.17/envs/a_project_3_9_17
  a_project_3_9_17 --> /Users/kimjaemin/.pyenv/versions/3.9.17/envs/a_project_3_9_17

3. 가상환경 활성화

: 바탕화면에 a_project 라는 디렉토리를 생성하고 방금 생성한 가상환경을 해당 디렉토리에서 우선 인식 되도록 local 명령어를 사용해 보겠다.

# 바탕화면 이동 및 a_project/ 생성 후 이동
$ cd ~/Desktop/ && mkdir a_project && cd a_project

# a_project 경로에 local 등록 // 이번에는 python 버전을 직접 기입하지 않고 방금 생성한 가상환경 이름을 기입해주면 된다.
$ pyenv local a_project_3_9_17

: a_project 경로에서 local 명령어로 조금 전 생성한 가상환경을 등록 해주니까 아래 이미지와 같이 해당 경로에 .python-version 자료가 생성 된 것을 확인할 수 있고, 자동으로 가상환경이 활성화 된 것을 볼 수 있다. 이제 부터는 다른 경로에서 해당 디렉토리로 이동하면 바로 가상환경이 활성화 되는 것이다.

4. 가상환경 활성화 검증

: 진짜로 활성화가 잘 된 것인지 확인해보자. 바탕화면으로 이동하니까 아래 이미지와 같이 가상환경이 비활성화 된 것을 확인할 수 있다. 추가로 바탕화면에서 pip install pandas 명령어를 실행한 후 바탕화면과 a_project/ 경로에서 각각 pip list 명령어를 실행해 보겠다.

5. 가상환경 패키지 설치 경로 확인

: 그렇다면, a_project_3_9_17 가상환경 활성화 후 설치하는 패키지들은 어디에서 관리 될까? 바로 아래 경로에서 관리된다. 가상환경을 만들면 ~/.pyenv/versions/3.9.17/ 하위에 env/ 경로가 생기는데 3.9.17 버전에 대한 가상환경들이 모두 해당 경로 하위에 생기고 패키지 관리가 된다.

~/.pyenv/versions/3.9.17/envs/a_project_3_9_17/lib/python3.9/site-packages

6. 지정한 local 에서 가상환경이 바로 활성화 되는 이유?

: 위에서 이미 pyenv-virtualenv 를 init 시킬 수 있도록 zshrc 에 등록해 두었기 때문이다.

7. 수동으로 가상환경 활성화/비활성화 하는 방법

: init 명령어를 등록해 두었지만 그래도 수동으로 활성화/비활성화 하는 방법도 기록해 두자.

# 활성화
$ pyenv activate a_project_3_9_17
# pyenv activate [가상환경이름]

# 비활성화
$ pyenv deactivate

gitignore 활용하기

: 위에서 진행한 것 처럼 작업 프로젝트 경로에서 가상환경을 사용하면, .python-version 자료가 생기는 것을 확인할 수 있다. 보통 git 을 통해 프로젝트 형상관리를 하기 때문에 gitignore 에 커밋하지 않아도 되는 자료를 등록하여 레포지토리에 올라가지 않도록 하는 내용도 짧게 기록해 두자.

$echo ".python-version" >> .gitignore
$echo ".gitignore" >> .gitignore

참고

profile
안녕하세요. 데이터 엔지니어 김재민 입니다.

0개의 댓글