알아두면 좋은 파이썬 개념 - 3. 가상환경 (Virtualenv, Pyenv, Pipenv)

4 minute read

‘알아두면 좋은 파이썬 개념’ 시리즈의 세번째 글로 파이썬을 활용한 가상환경 구성 방법에 대해 알아보겠다.

가상환경

파이썬을 처음 사용하면 가상환경이라는 용어를 듣게 된다. 가상환경은 파이썬 버전과 라이브러리 버전들을 독립적으로 관리해 시스템 개발 시 버전으로 인한 충돌을 방지한다. 그냥 파이썬을 설치해서 라이브러리를 받아 사용해도 충분하지 않나 싶지만 여러 프로젝트를 하거나 다른 사람과 같이 작업할 때 에러를 마주하다보면 가상환경이 왜 필요한지 절실히 느끼게 된다.

Java나 Javascript에서는 maven이나 npm으로 프로젝트 시 당연하게 라이브러리 의존성이 관리된다. 파이썬은 개발 프로세스에 이런 강제성이 없는 경우가 있어 환경구성을 제대로 안하기도 하는데 프로젝트 의존성 관리 측면에서 다른 언어들의 프로젝트 설정처럼 반드시 필요한 설정이다.

그럼 가상환경을 구성하는데 사용하는 몇가지 방법들에 대해 알아보자.

Virtualenv(20.4.4), Venv

Virtualenv와 Venv는 디렉토리로 만들어지는 파이썬 가상환경이다. Venv가 3.5 파이썬부터 내장으로 설치되어있는 라이브러리라는 점을 제외하면 큰 차이는 없지만 관습적으로 Virtualenv를 사용한다.

Virtualenv 설치 및 가상환경 생성 방법

# 설치
$ pip install virtualenv
# 시스템 파이썬 버전으로 test라는 이름의 가상환경 생성
$ virtualenv test
# --python 옵션을 통해 원하는 파이썬 런타임으로 가상환경 생성
$ virtualenv test --python=/Users/username/.pyenv/versions/3.9.1/bin/python3.9

pip을 통해 Virtualenv를 깔게 되면 virtualenv 명령어를 이용해 가상환경을 생성할 수 있다. 아무 옵션을 주지 않고 시스템 파이썬 버전으로 가상환경을 만들거나 -—python 옵션을 통해 원하는 파이썬 버전의 경로를 지정해 가상환경을 만들 수 있다.

가상환경 활성화 및 비활성화

.
└── test
    ├── bin
    ├── lib
    ├── pyvenv.cfg
    └── site-packages
# 가상환경 활성화
$ source test/bin/activate
# 가상환경 비활성화
$ deactivate

Virtualenv 명령어를 실행하면 가상환경 이름의 디렉토리가 만들어진다. 가상환경은 만들어진 bin 디렉토리의 activate 파일을 source test/bin/activate 커맨드로 실행시켜 활성화된다.

라이브러리 설치

# 그냥 설치
$ pip install requests
# 버전 특정 (권장)
$ pip install requests==2.25.1

가상환경이 활성화되면 pip을 이용해 라이브러리를 설치하면 된다. 가상환경 디렉토리 내의 site-packages에 라이브러리들이 독립적으로 저장되어 다른 프로젝트나 시스템 파이썬과 충돌하지 않게 된다.

requirements.txt 생성

$ pip freeze > requirements.txt

requirements.txt 이용 라이브러리 설치

$ pip install -r requirements.txt 

다른 사람과의 협업이나 다른 시스템에서 동일 환경을 구성하기 위해 pip freeze 로 설치된 라이브러리에 대한 requirements.txt 파일을 만든다. 다른 환경에서는 pip install -r requirements.txt 로 requirements.txt 파일을 참조해 라이브러리를 설치할 수 있다.

Pyenv (1.2.6)

Pyenv는 파이썬에 대한 버전 관리를 담당한다. Virtualenv만으로 가상환경을 구성할 수 있으면 좋겠지만 실제로는 같은 라이브러리 버전을 사용하더라도 파이썬 버전에 따라 시스템이 작동하지 않는 경우가 발생한다. Pyenv는 다양한 파이썬 버전을 관리함으로써 파이썬 버전에 대한 의존성 문제를 해결한다.

Pyenv 설치 및 설정

# 설치
$ brew install pyenv
# pyenv 사용 위한 .zshrc 파일 수정
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
$ source ~/.zshrc

Pyenv는 brew 설치 후에 zshrc 설정을 하지 않으면 특정 기능들이 작동하지 않는다. .zshrc 파일에 환경변수와 init 커맨드를 추가하면 zsh를 실행할 때마다 해당 커맨드가 작동되어 정상적으로 pyenv를 사용할 수 있다.

Pyenv 사용법

# 설치 가능한 python 버전 확인
$ pyenv install --list
# 파이썬 버전 설치
$ pyenv install 3.7.1
# 설치된 파이썬 버전 확인
$ pyenv versions
# 사용 파이썬 버전 변경
$ pyenv global 3.7.1

사용법은 간단하다. pyenv install 을 통해 원하는 파이썬 버전을 설치하고 pyenv global 을 활용해 원하는 파이썬 버전을 선택하면 된다.

pyenv-virtualenv 설치

# 설치
$ brew install pyenv-virtualenv
# .zshrc 파일 수정
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc

Pyenv를 사용하면 여러 파이썬 버전에 대한 관리가 가능하지만 이를 활용해 가상환경을 만드려면 pyenv- virtualenv가 필요하다. Pyenv 때와 마찬가지로 brew로 설치 후에 .zshrc 파일을 수정한다.

pyenv-virtualenv 사용법

# pyenv에 설치된 특정 파이썬 버전으로 가상환경 생성
$ pyenv virtualenv 3.9.1 test2
# 가상환경 활성화
$ pyenv activate test2
# 가상환경 삭제
$ pyenv uninstall test2

pyenv-virtualenv를 이용하면 Pyenv에 깔린 파이썬 버전을 pyenv virtualenv 3.9.1 test2 와 같이 명시하여 가상환경 생성이 가능하다.

Pipenv

Pyenv + pip + Virtualenv 를 합친 형태이다. 원하는 파이썬 버전을 정의해서 깔 수 있고 pipfile에 파이썬 버전과 라이브러리 버전을 관리하여 requirements.txt 파일을 별도로 관리할 필요가 없다.

정말 편리한 가상환경 관리 도구이나, install이 느리고 특정 라이브러리 설치 시 버그가 발생하는 단점이 있다. 프로젝트에서 사용하는 라이브러리들이 pipenv와 충돌하지 않는다면 pipenv는 좋은 선택지라고 생각한다. 문제가 생긴다면 pipenv 대신 pyenv-virtualenv를 사용하면 된다.

Pipenv 설치

# 설치
$ brew install pipenv

Pipenv 사용법

# 환경 구성
$ pipenv install --python 3.8
# 가상환경 활성화
$ pipenv shell
# 라이브러리 설치
$ pipenv install requests==2.25.1
# 라이브러리 삭제
$ pipenv uninstall requests
# 가상환경 나오기
$ deactivate

Pipenv도 pipenv install --python 3.8 에서 보는 것처럼 파이썬 버전을 지정해 환경을 구성할 수 있다. 가상환경의 활성화는 pipenv shell 을 통해 한다.

Pipfile

.
├── Pipfile
└── Pipfile.lock
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = "==2.25.1"

[dev-packages]

[requires]
python_version = "3.8"

Pipenv는 독특하게 Pipfile이라는 파일이 가상환경을 만들 때 생성된다. Pipfile 안에는 깔려있는 라이브러리와 파이썬 버전이 명시되며 이를 통해 다른 환경에서도 가상환경을 구성하게 된다.

Conda

Conda를 통해서도 가상환경을 구성할 수 있다. 데이터 분석으로 코딩을 시작한 경우 Conda를 많이 쓰게 되는데 사용할 때 디렉토리 구조도 복잡해지고 필요없는 라이브러리도 많이 깔리게 된다. 깔끔하게 pyenv-virtualenv를 이용하거나 pipenv를 이용하는 것이 더 좋아보인다.

Docker

파이썬 버전, 라이브러리에 대한 의존성 관리를 완벽하게 해도 다른 사람의 코드가 안 돌아갈 때가 있다. 이런 경우 대부분 os가 원인이다. 결국 os까지 다 맞춰야 완벽하게 동일하게 환경이 구성되어 코드 작동 시 문제가 없다.

Docker로 원하는 os로 컨테이너로 구성해 그 안에 파이썬 가상환경을 구성한다면 조금 더 완벽한 가상환경을 만들 수 있다.

References

Leave a comment