Logo

파이썬의 venv 모듈로 가상 환경 사용하기

이번 포스팅에서는 의존성 충돌없이 파이썬 개발을 할 수 있도록 도와주는 매우 유용한 도구인 venv 내장 모듈에서 대해서 알아보겠습니다.

의존성 충돌 문제

하나의 컴퓨터 상에서 Python으로 개발된 여러 개의 프로젝트 돌리는 경우 프로젝트 간에 의존성(dependency) 충돌이 발생하기 쉬운데요.

예를 들어서 프로젝트 A에서 Django 패키지 3.x 버전을 사용하는데, 프로젝트 B에서 Django 패키지를 4.x 버전을 사용하고 있다면, 둘 중 하나의 프로젝트에서는 Django 앱을 실행할 때 오류가 발생할 가능성이 높습니다.

왜냐하면 두 개의 프로젝트가 동일한 컴퓨터에 설치된 하나의 파이썬 실행 환경(runtime)을 사용하므로 파이썬 패키지를 서로 공유하게 되기 때문인데요. 만약에 프로젝트 B에서 마지막에 Django 패키지를 설치했다면 해당 컴퓨터에는 Django 4.x 버전이 설치되어 있기 때문에 Django 3.x 버전을 사용하도록 되어 있는 프로젝트 A에서 Django 앱을 실행할 때 패키지 버전이 맞지 않아 오류가 발생하는 것이지요.

파이썬에서는 패키지를 설치할 때는 보통 pip라는 패키지 매니저를 사용하는데, 기본적으로 해당 컴퓨터 상에서 파이썬이 설치된 경로의 site-packages 디렉터리에 안에 설치됩니다. 노드의 npm이나 자바의 maven과 같은 패키지 매니저가 프로젝트 별로 패키지 설치를 지원하는 반면에, 아직까지 파이썬의 pip는 시스템 전역으로만 패키지를 설치할 수 있습니다.

파이썬의 패키지 매니저인 pip(Package Installer for Python)에 대해서는 별도 포스팅에서 다루고 있으니 참고 바랍니다.

가상 환경과 venv 모듈

다른 언어와 달리 파이썬에서는 일반적으로 프로젝트 별로 독립된 개발 환경을 구성하기 위해서 가상 환경 (virtual environment)을 이용하는데요. venv라는 내장 모듈을 통해서 쉽게 가상 환경을 만들 수 있으며 이를 통해 프로젝트 간 의존성 충돌 문제를 효과적으로 예방할 수 있습니다.

파이썬에서 가상 환경(virtual environment)은 하나의 컴퓨터에서 프로젝트 별로 독룁된 파이썬 실행 환경(runtime)을 구성할 수 있도록 해줍니다. 가상 환경을 사용하지 않으면 컴퓨터 내의 모든 프로젝트에서 하나의 파이썬 실행 환경을 사용하면서 동일한 경로에 외부 패키지를 설치하고 서로 공유하게 됩니다. 이럴 경우, 하나의 프로젝트에서 설치한 패키지의 버전이 다른 프로젝트에서 설치한 동일 패키지의 다른 버전과 충동을 일으킬 소지가 생기기 때문에, 일반적으로 파이썬 프로젝트 별로 독립된 가상 환경을 구성하여 사용하는 것이 권장됩니다.

가상 환경 구성

파이썬 2에서는 virtualenv라는 외부 패키지를 사용해서 가상 환경을 구성했었는데, 파이썬 3.3 부터는 venv 모듈이 기본적으로 포함되어 있기 때문에 별도 외부 패키지 설치없이 파이썬만 설치되어 있으면 바로 가상 환경 구성이 가능하게 되었습니다.

가상 환경을 구성할 프로젝트 디렉터리에 들어가서 아래와 같이 커맨드를 날리면 .venv라는 디렉터리가 생길 것입니다. 여기서 반드시 디렉터리 이름을 .venv로 할 필요는 없지만, 대부분의 파이썬 프로젝트들이 따르는 관행이므로 지켜주시는 게 좋습니다.

$ cd <프로젝트 디렉터리>
$ python -m venv .venv
$ ls -a
.     ..    .venv

가상 환경을 굳이 Git과 같은 소스 버전 관리 시스템에 올릴 필요는 없으므로 .venv 디렉터리를 .gitignore 파일에 추가해줍니다.

$ echo '.venv' >> .gitignore

가상 환경 활성화

가상 환경을 활성화 하기 위해서는 .venv 디렉토리 안에 있는 스크립트를 실행해줘야 하는데요. 저처럼 MacOS를 사용하시는 분들은 bin 디렉토리 안에 있는 activate 파일을 실행하면 됩니다.

그러면 쉘 프롬프트 앞에 (.venv)라고 붙으면서 가상 환경이 활성화 될 것입니다.

$ . .venv/bin/activate
(.venv) $

혹시 . 커맨드가 안 먹는 분들은 source 커맨드를 쓰셔도 됩니다.

$ source .venv/bin/activate
(.venv) $

Windows 계열 컴퓨터에서는 Scripts 디렉토리 안에 있는 activate.bat 파일을 실행하면 됩니다.

Scripts\activate.bat

이제 which 커맨드를 통해 어떤 파이썬 인터프리터가 사용되는지 확인보겠습니다. venv 디렉터리 안에 있는 bin/python이 컴퓨터에 기본 설치된 파이썬 대신에 사용됨을 알 수 있습니다.

(.venv) $ which python
/Users/dale/temp/my-project/.venv/bin/python

가상 환경에서 제공하는 파이썬의 버전은 다음과 같이 확인할 수 있습니다.

(.venv) $ python -V
Python 3.11.2

가상 환경에 패키지 설치

가상 환경이 활성화된 상태에서 패키지를 설치하면, .venv 디렉터리 내부에 해당 패키지가 설치됩니다. 즉, 컴퓨터에 설치되어 있는 파이썬 실행 환경이나 다른 파이썬 프로젝트에 아무 영향을 주지 않습니다.

(.venv) $ pip install requests
Collecting requests
  Downloading requests-2.28.2-py3-none-any.whl (62 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.8/62.8 kB 2.7 MB/s eta 0:00:00
Collecting charset-normalizer<4,>=2
  Downloading charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl (121 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 121.7/121.7 kB 5.9 MB/s eta 0:00:00
Collecting idna<4,>=2.5
  Downloading idna-3.4-py3-none-any.whl (61 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.5/61.5 kB 5.1 MB/s eta 0:00:00
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.15-py2.py3-none-any.whl (140 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 140.9/140.9 kB 7.3 MB/s eta 0:00:00
Collecting certifi>=2017.4.17
  Downloading certifi-2022.12.7-py3-none-any.whl (155 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 155.3/155.3 kB 6.8 MB/s eta 0:00:00
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
Successfully installed certifi-2022.12.7 charset-normalizer-3.1.0 idna-3.4 requests-2.28.2 urllib3-1.26.15

[notice] A new release of pip available: 22.3.1 -> 23.0.1
[notice] To update, run: pip install --upgrade pip

pip show 커맨드로 설치된 패키지의 세부사항을 살펴보면 .venv/lib/python3.7/site-packages에 해당 패키지가 설치되었다는 것을 확인할 수 있습니다.

$ pip show requests
Name: requests
Version: 2.28.2
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: /Users/daleseo/temp/learn-venv/.venv/lib/python3.11/site-packages
Requires: certifi, charset-normalizer, idna, urllib3
Required-by:

이렇게 독립된 가상 환경에 패키지를 설치하게 되면 다른 프로젝트에서 사용하고 있는 requests 패키지를 덮어쓸 일이 없습니다. 반대로 다른 프로젝트에서도 이 프로젝트에서 사용하고 있는 requests 패키지를 덮어쓸 위험이 사라지게 됩니다.

가상 환경 비활성화

가상 환경을 빠져나올 떄는 터밀널에 deactivate만 입력해주면 됩니다. 가상 환경이 비활성화 되면 다시 원래대로 운영체제의 기본 파이썬 인터프리터를 사용하게 됩니다.

(.venv) $ deactivate
which python
/usr/local/bin/python3

저처럼 MacOS에서 pyenv를 사용하시는 분들은 다음과 같이 약간 다른 디렉토리가 보일 것입니다.

(.venv) $ deactivate
which python
/Users/daleseo/.pyenv/shims/python

하나의 Mac에서 여러 버전의 파이썬을 관리해주는 도구인 pyenv에 대해서는 관련 포스팅을 참고 바랍니다.

마치면서

이상으로 파이썬에 기본으로 내장된 venv 모듈을 이용하여 가상 환경을 사용하는 방법에 대해서 살펴보았습니다. venv를 잘 활용하셔서 의존성 충돌에 대한 걱정 없이 프로젝트 별로 서로 격리된 파이썬 환경에서 개발하실 수 있으셨으면 좋겠습니다.

참고로 가상 환경 기반으로 좀 더 체계적인 의존성 관리가 필요하시다면 pipenv라는 별도로 설치가 필요한 강력한 도구도 있습니다. 이 부분에 대해서는 별도 포스팅에서 다루고 있으니 참고해보시면 좋을 것 같습니다.