태그 보관물: 가상환경

파이썬3 가상 환경 만들기

파이썬에서 프로젝트를 진행할 때는 다양한 프로그래밍 환경에서 외부 라이브러리를 이용해 진행하게 되는데 이럴 때 의존성 관리가 필요하다. 프로그램이 의존하는 환경과 라이브러리가 바뀌면 프로그램에 문제가 발생할 가능성이 있으므로 개발 당시의 환경을 격리할 필요가 있다. 특히 한 컴퓨터에서 여러 프로젝트를 진행할 때 의존하는 라이브러리의 버전이 프로젝트마다 다르거나 한다면...? 이럴 때 가상 환경을 만들어서 프로젝트를 격리시켜 진행하면 좀 더 안정적인 프로젝트 진행이 가능하다.

가상 환경의 개념은 간단하다. 파이썬 3에서 기본적으로 제공하는 venv를 이용해 단일 프로젝트를 위한 공간을 만들고, 이곳에서 필요한 라이브러리를 설치하면 다른 프로젝트와 인터프리터나 라이브러리를 공유하지 않는다. 물론 프로젝트 공간(가상 환경)은 프로젝트마다 별개이기에 프로젝트마다 필요한 라이브러리는 별도로 설치해야 하고 필요에 따라 서로 별개로 업그레이드할 수 있다.

먼저 아래 명령어로 venv를 이용해 myproject라는 프로젝트 디렉터리를 만든다.

ubuntu@mylab01:~$ python -m venv myproject

그럼 myproject라는 디렉터리가 만들어지고, 안으로 들어가 보면 가상 환경을 구성하는 다양한 디렉터리가 보인다.

ubuntu@mylab01:~$ ls
myproject
ubuntu@mylab01:~$ cd myproject/
ubuntu@mylab01:~/myproject$ ls
bin  include  lib  lib64  pyvenv.cfg  share

다음 명령어로 가상 환경을 활성화하면 프롬프트가 바뀌면서 현재 (myproject)라는 가상환경이 활성화된 것을 보여준다.

ubuntu@mylab01:~/myproject$ source bin/activate
(myproject) ubuntu@mylab01:~/myproject$

이제 이 가상환경에다 예를 들어 requests 라이브러리를 설치해 보자.

(myproject) ubuntu@mylab01:~/myproject$ pip install requests
Collecting requests
  Using cached requests-2.26.0-py2.py3-none-any.whl (62 kB)
Collecting idna<4,>=2.5; python_version >= "3"
  Using cached idna-3.2-py3-none-any.whl (59 kB)
Collecting charset-normalizer~=2.0.0; python_version >= "3"
  Downloading charset_normalizer-2.0.6-py3-none-any.whl (37 kB)
Collecting certifi>=2017.4.17
  Using cached certifi-2021.5.30-py2.py3-none-any.whl (145 kB)
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.7-py2.py3-none-any.whl (138 kB)
     |████████████████████████████████| 138 kB 36.0 MB/s 
Installing collected packages: idna, charset-normalizer, certifi, urllib3, requests
Successfully installed certifi-2021.5.30 charset-normalizer-2.0.6 idna-3.2 requests-2.26.0 urllib3-1.26.7

pip list로 설치된 라이브러리를 조회해 보면 기존에 많은 라이브러리를 설치해서 사용 중임에도 여기서는 requests 및 의존 라이브러리만 추가된 것으로 표시된다. 즉, 다른 전역 환경과 완전히 별개로 운영되는 것이다.

(myproject) ubuntu@mylab01:~/myproject$ pip list
Package            Version  
------------------ ---------
certifi            2021.5.30
charset-normalizer 2.0.6    
idna               3.2      
pip                20.0.2   
pkg-resources      0.0.0    
requests           2.26.0   
setuptools         44.0.0   
urllib3            1.26.7   

만약 다른 곳에 이 프로젝트를 배포하고 싶다면 의존 라이브러리 목록을 requirements.txt라는 파일로 뽑고, 다른 곳에서 pip install -r requirements.txt를 실행하면 현재 설치된 라이브러리의 버전에 맞춰 라이브러리들이 설치된다.

(myproject) ubuntu@mylab01:~/myproject$ pip freeze > requirements.txt
(myproject) ubuntu@mylab01:~/myproject$ cat requirements.txt 
certifi==2021.5.30
charset-normalizer==2.0.6
idna==3.2
requests==2.26.0
urllib3==1.26.7
(myproject) ubuntu@mylab01:~/myproject$ pip install -r requirements.txt 
Requirement already satisfied: certifi==2021.5.30 in ./lib/python3.8/site-packages (from -r requirements.txt (line 1)) (2021.5.30)
Requirement already satisfied: charset-normalizer==2.0.6 in ./lib/python3.8/site-packages (from -r requirements.txt (line 2)) (2.0.6)
Requirement already satisfied: idna==3.2 in ./lib/python3.8/site-packages (from -r requirements.txt (line 3)) (3.2)
Requirement already satisfied: requests==2.26.0 in ./lib/python3.8/site-packages (from -r requirements.txt (line 4)) (2.26.0)
Requirement already satisfied: urllib3==1.26.7 in ./lib/python3.8/site-packages (from -r requirements.txt (line 5)) (1.26.7)

작업을 끝내고 가상환경을 종료하려면 deactivate라고만 입력하면 된다.

(myproject) ubuntu@mylab01:~/myproject$ deactivate 
ubuntu@mylab01:~/myproject$

참고로 인터프리터 또한 가상환경에서 별도로 설치된 것을 쓰기에 다음과 같은 결과를 볼 수 있다.

ubuntu@mylab01:~/myproject$ which python
/usr/bin/python
ubuntu@mylab01:~/myproject$ source bin/activate
(myproject) ubuntu@mylab01:~/myproject$ which python
/home/ubuntu/myproject/bin/python

참고: https://docs.python.org/ko/3/tutorial/venv.html