본문 바로가기

Pyhon/Django

[Pyhon/Django] 장고 기초#002.가상 환경에서 패키지 관리하기

 

파이썬 가상 환경(Virtual environment)이란?

파이썬을 사용하면 pip(pip3)를 사용하여 패키지를 설치하고 관리합니다. pip을 날 것 그대로 사용하면 모든 패키지가 프로젝트에 관계 없이 글로벌하게 적용됩니다. 이러한 방식은 하나의 개발용 PC에서 여러 개의 프로젝트를 관리하기에 부적합합니다. 같은 패키지를 사용하더라고 서로 다른 프로젝트 간 상이한 버전이 필요 할 수 있으며, 특정 프로젝트에서만 사용되는 패키지도 모두 포함하고 있기 때문입니다.

이러한 문제를 해결하기 이해서 파이썬에서는 가상 환경 기반에서 패키지를 관리하게 됩니다. 마찬가지로 가상 환경안에는 파이썬의 버전과 인터프리터(Interpreter) 역시 관리됩니다. 즉, 파이썬의 가상 환경이란 "프로젝트 별로 파이썬, 인터프리터, 그리고 패키지를 독립적으로 관리하기 위한 환경"이라고 정리 할 수 있습니다.

여러 개의 프로젝트를 관리할 예정이라면 가상 환경은 필수입니다. 당장에 파이썬과 장고를 deep하게 학습하지 않더라도, 파이썬 개발에서는 가상 환경 사용을 권장합니다.

가상 환경(pythonenv) 설치하기

가상 환경 역시 파이썬의 패키지 중 하나입니다. pip3를 사용하여 virtualenv를 설치합니다.

$ pip3 install virtualenv

패키지를 설치하였다면, 다음과 같이 가상 환경을 운용할 수 있습니다.

  • 가상 환경 생성
  • 가상 환경 제거
  • 가상 환경 진입
  • 가상 환경 퇴장
  • 가상 환경 패키지 내보내기(Package export)
  • 가상 환경 패키지 불러오기(Package import)

가상 환경 생성

가상 환경을 생성하는 커맨드입니다. 가상 환경 생성 시에는 가상 환경에서 사용하고자 하는 파이썬 버전의 입력이 필요하며, 내 PC에 설치 되어있는 버전 중 하나를 선택하여 입력하면 됩니다. 이 때 주의할 점은 가상 환경 생성 커맨드가 실행 된 디렉토리에 가상 환경이 생성 된다는 점입니다. 가상 환경에 진입하기 위해서는 가상 환경 경로를 알고 있어야 하므로, 디렉토리를 하나 생성하여 모든 가상 환경을 한 곳에서 관리하는 것이 용이합니다.

$ virtualenv --python=[파이썬 버전] [가상 환경 이름]
$ virtualenv --python=python3.9.9 testenv1
$ ls
testenv1

디렉토리에 파일 목록을 출력하면, 방금 생성한 가상 환경 이름의 디렉토리가 생성 된 것을 볼 수 있습니다.

가상 환경 제거

가상 환경은 디렉토리에서 관리되기 때문에, 디렉토리 자체를 삭제하면 가상 환경을 제거한 것이나 다름 없습니다.

$ rm -fr testenv1

가상 환경 진입

이 커맨드는 가상 환경이 설치 된 위치에서 실행해야 합니다. 가상 환경에 진입하면, 커맨드 라인에서 사용 중인 가상 환경 이름이 소괄호 () 사이에 출력되는 것을 볼 수 있습니다.

$ source [가상 환경 이름]/bin/activate
$ source testenv1/bin/activate
(testenv1) namepgbui-MacBook-Pro:~ namepgb$

다른 위치에서 가상 환경이 진입하고 싶다면, 해당 가상 환경이 설치되어 있는 경로를 추가하면 됩니다.

$ source [가상 환경 경로]/[가상 환경 이름]/bin/activate
$ pwd
/Users/namepgb/Desktop/Django/Virtualenv
$ source /Users/namepgb/Desktop/Django/Virtualenv/testenv1/bin/activate
(testenv1) namepgbui-MacBook-Pro:~ namepgb$

가상 환경 퇴장

가상 환경에서 벗어나기 위해서는 다음 커맨드를 실행합니다. 가상 환경 내에서 사용하는 명령은 일반적은 커맨드 처럼 자동 완성이 가능합니다(반대로, 가상 환경을 벗어나면 가상 환경에서 실행 가능한 명령어는 자동 완성이 불가합니다).

$ deactivate

가상 환경 패키지 내보내기(Pakage export)

가상 환경 내에 설치된 패키지 리스트를 텍스트 파일로 추출 할 수 있습니다.

$ pip3 freeze > requirements.txt 
$ ls
requirements.txt
$ cat requirements.txt

방금 가상 환경을 생성하였다면, 아무런 패키지를 설치하지 않았기 때문에 텍스트 파일은 아무 내용도 포함하지 않습니다. 임의로 패키지 하나를 설치하고, 패키지를 다시 내보냅니다. 방금 설치한 패키지의 이름과 버전이 텍스트 파일에 포함 된 것을 확인 할 수 있습니다.

$ pip3 install emoji
$ pip3 freeze > requirements.txt
$ cat requirements.txt
emoji==1.6.1

내 가상 환경에서 설치된 패키지는 다음 디렉토리에서도 확인 할 수 있습니다. 우선 개발 환경에 따라서 패키지 설치 위치가 다를 수 있으므로, sys.path를 사용하여 경로를 확인합니다. 이 경로는 가상 환경 또는 글로벌 환경(가상 환경 미사용)에 따라서 달라집니다. 이는 가상 환경 사용 여부 또는 각 가상 환경에 따라서 패키지가 분리되어 관리된다는 것을 보여줍니다.

$ python3
>>> import sys
>>> print(sys.path)
['...', '/Users/namepgb/Desktop/Django/Virtualenv/testenv1/lib/python3.9/site-packages']
>>> exit()
ls -l /Users/namepgb/Desktop/Django/Virtualenv/testenv1/lib/python3.9/site-packages

가상 환경 패키지 불러오기(Pakcage import)

가상 환경을 사용 중이라면, 가상 환경에서 퇴장합니다. 새로운 가상 환경을 생성하고 진입합니다.

$ virtualenv --python=python3.9.9 testenv2
$ ls
testenv1	testenv2
$ source testenv2/bin/activate
(testenv2) namepgbui-MacBook-Pro:~ namepgb$

파이썬 인터프리터를 실행 후, emoji 패키지를 import하면 패키지를 찾지 못하는 것을 확인 할 수 있습니다. 패캐지 설치 경로에서도 emoji와 관련 된 패키지 파일을 발견하지 못합니다.

$ python3
>>> import emoji
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'emoji'
>>> import sys
>>> print(sys.path)
['...', '/Users/namepgb/Desktop/Django/Virtualenv/testenv2/lib/python3.9/site-packages']
>>> exit()
ls -l /Users/namepgb/Desktop/Django/Virtualenv/testenv2/lib/python3.9/site-packages | grep emoji

이제 가상 환경 패키지 내보기에서 생성된 requirements.txt를 사용하여 새로운 가상 환경(testenv2)에 기존 가상 환경(testenv1)의 패키지를 불러오도록 하겠습니다. 이 커맨드가 실행되면, 텍스트 파일에 포함 되어 있는 패키지들을 각 버전에 따라서 현재 가상 환경에 설치하게 됩니다.

$ pip3 install -r requirements.txt

패키지 리스트를 정상적으로 불러왔으면, 이제 새로운 가상 환경(testenv2)에서도 emoji 패키지를 사용 할 수 있습니다. 마찬가지로 패키지 설치 경로에서도 emoji 패키지를 찾을 수 있는 것을 확인 할 수 있습니다.

$ python3
>>> import emoji
>>> print(emoji.emojize('Python is :thumbs_up:'))
Python is 👍
>>> exit()
ls -l /Users/namepgb/Desktop/Django/Virtualenv/testenv2/lib/python3.9/site-packages | grep emoji
drwxr-xr-x   6 namepgb  staff   192 12  6 07:01 emoji
drwxr-xr-x  10 namepgb  staff   320 12  6 07:01 emoji-1.6.1.dist-info