파이썬 가상환경이 필요한 이유와 사용법 (venv, virtualenv)

2020. 03. 11 IT/컴퓨터 > Python

picture by Chris Ried @ unsplash.com

 

파이썬에서 프로젝트를 진행할 때는 각각의 프로젝트 별로 가상환경을 만들어서 진행해 주는 것이 좋다. 사실 프로젝트라 할만한 것을 제대로 진행해 보기 전, 책을 보면서 코어 파이썬 문법을 배우고 예제만 따라해 보는 수준에서는 왜 굳이 귀찮게 가상환경을 설치하는것인지 잘 이해가 되지 않았다.

처음 파이썬을 배울때 아나콘다(Anaconda) 배포판을 이용해서 파이선을 설치했는데, 아나콘다를 설치하면 수백가지의 패키지가 같이 설치된다. 이후로도 이것저것 배우면서 설치한 패키지들이 많이 있었는데, 이렇게 한번 설치해 놓으면 패키지를 아무거나 필요한 대로 불러서 쓸 수 있는데 굳이 왜 가상환경을 만들어서 이미 설치했던 패키지를 또 설치하라는건지 이해가 되지 않았다.

그런데 Django를 배우면서 직접 프로젝트들을 한두 개 진행하다 보니 왜 가상환경이 필요한지 저절로 알게 되었다. 

 

1. 프로젝트를 배포하면 원격 서버에 따로 패키지들을 설치해 줘야 하는데, 내가 이 프로젝트만을 위해서 설치한 패키지들이 어떤 것들이 있는지 알 수가 없었다. 내가 설치한 아나콘다 배포판에는 기본적으로 수많은 패키지가 포함되어 있고 그 환경에 내가 추가로 설치한 패키지들이 뒤섞여 있는 상태이다. 

한편 배포하려는 서버에는 처음에는 아무것도 깔려 있지 않기 때문에 필요한 것들을 설치해 주어야 하는 상황이다. 그런데 유료로 사용하는 서버에 공간만 차지하고 쓰지도 않을 패키지들을 설치할 필요는 없으니 딱 내가 사용한 패키지들만 설치를 해야 하는데 그걸 구분하는게 문제였다.

물론 어떤 패키지를 설치할 때마다 따로 적어 놓는다든지 할 수도 있겠지만, 프로그래밍을 배운다는 입장에서 그런 원시적인 짓을 할수는 없지 않나. 그리고 pip 명령을 이용해서 어떤 패키지를 설치하면 딱 그 패키지만 설치되는게 아니고 딸려 있는 여러가지 이름이 다른 패키지들도 자동으로 설치가 되는 경우가 많기 때문에, 그런것들까지 다 확인한다는것은 사실상 불가능하다.

그리고 서버에 일일이 그 패키지들을 설치해주는 것이 혹시 가능하다 하더라도 정확히 내가 사용했던 버전과 버전이 맞는지 일일이 확인해야 할텐데, 그걸 수작업으로 한다는것도 역시 원시적이고 말이 안된다. 그래서 미리 가상환경을 만들어 내가 실제로 이 프로젝트에 사용한 패키지들만 설치를 해야 할 필요성을 느꼈다.

 

2. 그리고 시간이 지남에 따라 패키지들이 업데이트되는데, 이것저것 업데이트를 하다 보면 서로 의존적인 패키지들 사이에 버전이 맞지 않아 호환이 되지 않는 경우들이 생긴다. 그렇다고 특정한 프로젝트 하나를 위해 언제 지원이 끊길지 모르는 예전 버전의 패키지를 로컬에 계속 유지할 수도 없고, 패키지가 업데이트되어 호환성 문제가 생길 때마다 프로젝트의 코드를 일일이 수정하는 것도 실질적으로 불가능하다.

아예 마음먹고 프로젝트를 메이저 버전업을 하면서 갈아 엎어버리는 경우라면 모를까, 구 버전에서 잘 작동하는 프로젝트의 코드를 개별 패키지들의 마이너 버전업 때마다 체크하고 수정하는 것도 불가능하고, 가능하더라도 시간낭비인 경우가 많을것이다. 그래서 한 프로젝트를 위해 확실히 작동하는 버전의 여러 패키지들을 한데 모아서 관리하기 위해서도 가상환경이 필요하다.

 

3. 파이썬 버전 자체가 다른 환경인 경우도 있겠다. 사실 나는 처음부터 파이썬 3로 입문해서 로컬에서 작업할 때는 파이썬 3만 쓰기 때문에 문제가 없지만, 프로젝트를 배포하려는 서버에는 파이썬 2만 설치된 경우도 있고, 2와 3이 같이 있는 경우도 있는 등 다양한 환경이다. 그런데 예를 들어 최신버전의 Django 같은 경우에는 파이썬 2에서는 아예 동작을 하지 않기 때문에 명시해서 파이썬 3를 설치해 주고 파이썬 3에 맞는 가상환경을 설정해 주지 않으면 프로젝트 구동 자체가 불가능하다.

 

이외에도 여러가지 이유가 있을 수 있겠지만, 하여튼 연습으로 끄적거리는게 아니라 제대로 구동되는 프로젝트를 목표로 하는 경우라면 프로젝트와 그 프로젝트에 사용된 패키지들은 언제나 한 묶음으로 움직이는 것이 좋겠다. 가상환경을 구성해 주는 유틸리티도 여러가지가 있는 모양이지만, 아래의 virtualenv 혹은 venv 정도면 일단은 무난히 사용할 수 있는것 같다.

 

#1. Virtualenv

이전 버전의 파이썬부터 많이 사용하던 프로그램이다.

$ pip install virtualenv

를 이용해서 설치하고, 그 virtualenv 를 이용해서 가상환경을 만들고 관리한다.

프로그램이 설치되면

$ virtualenv project_env

식으로 원하는 환경의 이름을 지정해서 구동해 주면 가상환경이 만들어진다. 가상환경에 필요한 파일들이  현재 위치 아래의 project_env 라는 디렉토리 안에 설치가 되는 식이다. 특정한 디렉토리에 설치하려면 절대 경로를 전부 입력해 주면 된다. 경험상은 프로젝트 루트 디렉토리 바로 아래에 만들어주면 관리가 편한것 같다.

 

만들어진 가상환경을 활성화하려면 activate 명령을 입력해야 한다.

리눅스의 경우는 경우에는 project_env/bin 아래에 activate 명령어 파일이 존재하므로 다음과 같이 입력한다. 성공적으로 활성화가 된 경우에는 프롬프트 앞에 (project_env) 와 같이 가상환경의 이름이 표시되는 것을 볼 수 있다.

$ source project_env/bin/activate

(project_env)$

 

윈도우의 경우는 project_env/scripts 폴더 안에 activate 명령어 파일이 존재하므로 아래와 같이 입력하면 활성화가 된다. 마찬가지로 프롬프트 앞에 가상환경의 이름이 보인다.

C:\project>project_env\scripts\activate

(project_env) C:\project>

 

이후 pip list 를 입력해 보면 기본 파이썬만 설치된 리스트를 확인할 수 있다.

가상환경에서 빠져나오는 경우에는

$ deactivate

를 입력하면 된다.

 

#2. Venv

그런데 virtualenv 는 동작이 좀 불안정한 경우가 많은것 같다. 정확히 원인이 뭔지 아직 찾아내지 못했지만 내가 사용하는 데스크탑만의 문제라고 생각했는데 DigitalOcean 에서 만든 우분투 서버에서도 비슷한 일이 일어나는걸로 봐서는 뭔가 virtualenv 설치 과정이나 activation 과정에서 문제가 있는것 같은데..

Activate를 해도 (가상환경이름) 이 보이지 않는 경우도 있고 (이때 pip list 해보면 파이썬만 설치되어 있는 것으로 나오는 걸로 봐서는 뭔가 작동은 하는데 정상 작동이 아닌것같다), 이런 경우에 pip install 을 이용해서 무슨 패키지를 설치하면 설치가 되긴 되는데, 가상환경에 설치되지가 않고 바깥의 원래 환경에만 설치되는 현상이 발생한다. 즉 설치 후 pip list 를 해 보아도 가상환경 안에는 설치한 패키지가 추가되어 있지 않고, 다시 pip install 을 해 보려고 하면 패키지가 이미 설치되어 있다는 메세지만 나온다. 

그리고 이런 현상이 일단 발생하면 deactivate를 해도 이전의 환경으로 돌아가지 않는다. Deactivate 해도 아무 에러 메세지는 발생하지 않는데, 이후에 pip list 해보면 정상적으로 가상환경이 종료되었다면 원래 환경에 설치된 수많은 패키지들이 보여야 하는데 하나도 안 보이고 기본 파이썬 패키지만 보인다.

일단 문제의 원인을 찾지 못해서 다른 대안을 찾아 보았는데, 다행히 파이썬 3.4 부터는 venv 라는 패키지가 기본으로 포함되어 있어서 따로 virtualenv를 설치하지 않아도 가상환경을 이용할 수 있다.

 

venv 를 이용해 가상환경을 만들려면 다음 명령어를 사용한다.

$ python -m venv project_env

 

가상환경 활성화 시키는 방법은 virtualenv 와 동일하다.

리눅스:

$ source project_env/bin/activate

(project_env)$

윈도우:

C:\project>project_env\scripts\activate

(project_env) C:\project>

 

venv 를 이용해 가상환경을 만든 경우에는 virtualenv 에서와 같은 문제를 아직 겪지 않았다. 어차피 파이썬에 내장된 기능이라면 굳이 virtualenv를 추가로 설치하는 번거로움을 피할 수도 있으니 요즘은 주로 venv 를 이용하고 있다.

 

#3. 가상환경에서의 패키지 관리

우선 로컬에서 가상환경을 활성화시키고 필요한 모든 패키지들이 설치되었으면, 어느 환경에서든 같은 패키지들이 한 묶음으로 설치되도록 requirements.txt 를 만들어 주는 것이 좋다. 일일이 손으로 적는게 아니라 

$ pip freeze > requirements.txt

를 입력하면 현재 환경에서 설치된 모든 패키지들의 이름과 버전이 명시된 requirements.txt 라는 파일이 자동으로 만들어진다. 

그리고 원격 서버에서 이 파일을 이용해 패키지들을 일괄 설치하려면

$ pip install -r requirements.txt

여기서 -r 은 requirement 를 설치할때는 붙이라고 되어 있는데 공식 documentation 을 보아도 아주 속시원한 설명은 없는 듯하다. 각종 옵션에 이런것들이 많은데 다소 심오한 파이썬 언어의 코어에 가까운 이야기들이라 일단은 그냥 시키는대로 하자..

 

위의 명령어로 필요한 패키지들을 일괄 설치해 주면 로컬과 원격지에서 똑같은 환경으로 작업이 가능하다. 다만 requirement.txt 를 이용한 설치 동작은 서로 의존적인 패키지들간에 간섭이 있어 잘 설치되지 않거나 에러가 나는 경우도 종종 있는 것 같다. 이런 경우에는 프로젝트 안의 패키지들을 pip list 로 다시 확인해서 잘 설치되지 않은 패키지들은 번거롭지만 수작업으로 설치해줘야 할 때도 있다.

 

사실 처음에는 좀 번거롭다고 생각되기도 했는데, 익숙해지니 가상환경을 만들지 않고 작업하는 것은 생각하기 어렵게 되었다. 깔끔한 작업 환경을 위해서 항상 가상환경을 먼저 구성하도록 하자.



최근 글 목록