본문 바로가기
IT/python

[python] pyenv 가상환경 설정 실습(feat. pyenv-virtualenv)

by 통섭이 2023. 1. 2.

서두

python 으로 프로젝트를 시작 할 때, 각 프로젝트마다 사용하는 파이썬 버전과 패키지가 다르기 때문에 가상환경을 사용하는 것은 필수이다. 만약 가상환경을 사용하지 않고 /usr/bin/python3 에 패키지를 깔기 시작하면 굉장히 피곤한 일들이 벌어지게 된다. 이 때, pyenv 를 사용하면 손쉽게 파이썬 버전 격리와 패키지 격리를 할 수 있게 된다!(엄밀히 말하면 격리는 pyenv로 하는건 아닙니다. 실습에서 확인 가능합니다) 그래서 pyenv 의 아주 기초적인 것들을 정리해 보았다.

pyenv

pyenv는 다양한 파이썬 버전을 관리하는데 유용한 도구이다. (진짜 엄청 좋아요..)
자세한 내용은 공식문서를 참조하기 바란다.

설치 및 설정

먼저 pyenv를 설치해야 하는데 mac에서는 굉장히 쉽게 설치가 가능하다 (윈도우는 죄송합니다...;;)

$ brew install pyenv 
(pyenv를 설치)

$ brew install pyenv-virtualenv 
(pyenv-virtualenv는 나중에 뒤에서 사용 할 텐데 미리 설치해 두자)

이렇게 해서 설치가 완료 되었으면, 사용할 수 있도록 pyenv 관련 설정을 쉘 설정 파일에 추가해야 한다. 각자가 사용하는 쉘에 따라 bash~/.bash_profile 혹은 ~/.bashrc에, zsh~/.zshrc 에 하기의 명령어들을 추가하도록 하자

export PYENV_PATH=$HOME/.pyenv
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi

이제 쉘에서 pyenv 라고 치면 사용 가능한 명령어 목록이 출력될 것이다. (안되면 터미널 껏다 켜보세요! 설정 파일이 읽히지 않았을 수도..) 아직 끝나지 않았다. 파이썬을 설치하기 전 필요 필요한 패키지들이 있다. pyenv 버전에 따라 설치해야 하는 패키지 목록이 바뀔 수 있으니 이 부분은 아래 명령어를 쳐도 안된다면 각자 확인이 필요하다.

$ brew install readline xz

사용법

이제 아래의 명령어들을 따라하면서 pyenv를 사용해보자.

1. 설치 가능한 패키지들 확인

$ pyenv install --list 
(이렇게 하면 굉장히 많은 버전이 나오는데, 만약 3.8.x를 설치하고 싶다면 아래 명령어로 확인하자)

$ pyenv install --list | grep 3.8.

2. 설치 및 설치 확인

$ pyenv install 3.8.13
(실제 설치)

$ pyenv versions 
* system
3.8.13 (설치 된 파이썬 환경 확인)

pyenv versions를 입력하면 * 이 붙은 항목이 현재 사용되고 있는 파이썬 버전이다. 처음에는 system 으로 되어 있는데, OS에 깔린 python을 사용하고 있다는 뜻이다. 주의할 점은 which python 을 쳐보면 /usr/bin/python3 이 나올 수도 있는데, 이는 아직 pyenv 를 사용하고 있지 않고, OS에 깔린 python 을 사용하고 있다는 뜻이다.(쉘 설정 파일에서 설정이 안 읽혔거나, 잘못 기입한 경우 등등..)

3-1. pyenv 실습

아래의 실습에서는 쉘 스크립트 파일이 잘못 기입되었다고 가정하고, pyenv를 init 하고 실습하겠다. (내부 동작 원리 이해를 위해서 한번 따라 해보심을 추천드립니다!)

$ which python3
/usr/bin/python3 (python 실행 시 OS 에 원래 깔려있던 버전이 사용됨)

$ python --version
3.8.9 (python 실행 시 OS 에 원래 깔려있던 버전이 사용됨)

$ eval "$(pyenv init -)"
(pyenv 시작)

$ which python3
/Users/user/.pyenv/shims/python3 (이제 python 명령어를 shims 디렉토리 아래서 가져다 쓰는 pyenv 쪽으로 python 설정이 바뀐 것으로 알 수 있다)

$ pyenv global 3.8.13
(이전에 깔았던 3.8.13 버전을 사용할 것을 명령, 참고로 다시 which python3 를 쳐도 이와 동일한 위치를 바라보는데, 이는 실제 사용 될 곳을 링크(?)해서 사용한다)

$ pyenv which python3
/Users/user/.pyenv/versions/3.8.13/bin/python3 (이제 python 명령어를 쳤을 때는, 실제로 이 경로의 python 이 실행되는 상태가 된 것!)

$ pyenv which pip 
/Users/user/.pyenv/versions/3.8.13/bin/pip (마찬가지로, 이 경로의 pip 이 실행된다!)

3-2. 실습 시 주의 할점

만약 쉘 설정 파일에 제대로 기입이 되지 않은 상태로, 쉘을 다시 실행한 경우 pyenv 가 실행되지 않아서 OS 의 파이썬이 사용될 수도 있다. 아래 예시는 쉘을 다시 실행 시켜서 이전에 pyenv 는 3.8.13 을 사용하도록 되어있지만, 실제로는 pyenv가 실행되지 않은 상태여서 python 3.8.9가 실행되는 경우를 설명한다.

$ pyenv versions
system
* 3.8.13

$ python --version
Python 3.8.9 (pyenv 의 * 마크는 3.8.13 에 되어있지만, 실행되지 않았기 때문에 실제로는 3.8.9가 실행된다)

$ which python3
/usr/bin/python3

$ eval "$(pyenv init -)"
(실행)

$ python --version
3.8.13

$ which python
/Users/user/.pyenv/shims/python3 (이제는 pyenv 를 통해 설정된 python 을 실행한다.)

4. 가상환경 생성

아래의 예시는 터미널을 다 끄고 다시 시작했다고 가정(pyenv 미실행 상태)하고 실습한다.

$ python --version
3.8.9 (OS 기본)

$ python -m venv local_version
(-m 은 모듈의 약자로 python 모듈을 커멘드로 실행할 때 사용한다. 즉, venv 모듈을 사용하여 local_version이라는 가상환경을 만들겠다는 의미)

$ source local_version/bin/activate
(가상환경 실행)

(local_version) $ python --version
3.8.9

$ deactivate
(가상환경 사용 중지)

$ eval "$(pyenv init -)"

$ python global 3.8.13

$ python --version
3.8.13 (이제는 python 명령어 사용 시, pyenv의 3.8.13 버전이 사용된다.)

$ python -m venv pyenv_version

$ source pyenv_version/bin/activate

(pyenv_version) $ python --version
3.8.13 (pyenv 를 사용해 3.8.13 버전의 가상환경이 생성됨)

$ deactivate

5. pyenv-virtualenv 사용한 가상환경 세팅

위의 방식으로 사용하고 싶은 버전의 python 을 pyenv 로 설정하고, python -m venv <가상환경명> 을 사용해 보았다면 아마 pyenv에 대한 이해가 되었을 것이다. 이제는 더 쉽게 pyenv-virtualenv 을 이용해 가상환경을 생성하고, 폴더에 접속하면 바로 해당 가상환경이 사용 되도록 설정해보자.
명령어 : pyenv virtualenv <version> <virtualenv_name>

$ cd pyenv_test_folder

$ pyenv versions
(가상환경 생성 시 사용할 버전을 확인)

$ pyenv install 3.8.11 
(실습을 위해 새로운 버전 설치)

$ pyenv virtualenv 3.8.11 test-env
(3.8.11 버전으로 생성)

$ pyenv virtualenvs
3.8.11/envs/test-env (created from /Users/user/.pyenv/versions/3.8.11)
test-env (created from /Users/user/.pyenv/versions/3.8.11)  
(virtualenvs 명령어를 통해 생성된 가상환경 확인)

$ pyenv versions
system
* 3.8.13
3.8.11
3.8.11/envs/test-env
test-env

$ pyenv local test-env
현재 폴더에 특정 가상환경(test-env)을 적용

$ pyenv versions
system
3.8.13
3.8.11
3.8.11/envs/test-env
* test-env
(이제는 * 마크가 이전에 3.8.13 에서 test-env 로 바뀐 것을 볼 수 있다. 이는 이 폴더에 local의 명령어로 test-env가 자동 사용되도록 지정했기 때문이다. 만약 다른 폴더로 이동하여 pyenv versions를 확인해보면 * 마크는 다른 곳으로 이동한 것을 확인할 수 있다)

$ python --version
3.8.11 (이 폴더에 들어오면 자동으로 적용된 가상환경의 버전이 사용된다)

$ ls -al
.
..
.python-version
(.python-version 이 숨김파일로 생겼고, cat 을 통해 확인하면 사용되고 있는 가상환경인 test-env가 나온다)

6. 정리

pyenv 와 pyenv-virtualenv를 사용하여 가상환경을 만들고 프로젝트별로 파이썬 버전과 패키지 버전을 관리할 수 있다. pyenv는 쉘 설정 파일에 추가하여 자동 실행되게 할 수도 있고, eval "$(pyenv init -)" 을 사용하여 시작시킬 수도 있다. 시작 되었는지는 which python 으로 확인해보면 shim 디렉토리를 사용하는지를 통해 알 수 있고, virtual-env 를 pyenv local 명령어로 특정 디렉토리에 실행해 놓은 경우는 해당 디렉토리에 들어가면 자동으로 실행된다. 사용 가능한 버전은 pyenv verions 를 통해 확인 가능하고, pyenv install <원하는버전> 을 통해 원하는 버전을 깔고, pyenv global <사용할 버전> 을 통해 사용할 수 있다. 사용할 버전으로 설정이 완료되면 python -m venv <가상환경명> 을 통해 가상환경을 만들수도 있고, pyenv virtualenv <version> <virtualenv_name> 를 사용해 만들 수도 있다.
(저도 처음 써보는거라 부족한 부분이 많은 포스트일 수 있습니다~ 잘못된 곳이 있으면 언제든 댓글로 알려주시고 질문 있으시면 남겨주세요^^)

댓글