venv - Virtual Environment
파이썬 개발을 하면서 구글링을 하다보면 venv라는 단어가 자주 눈에 들어온다.
venv는 Virtual Environment의 약자로 말그대로 가상환경이다.
파이썬으로 동시에 여러 프로젝트를 개발한다고 가정해보자.
A 프로젝트에서는 abc 모듈의 1.1.2 버전을 필요로하고 B프로젝트에서는 abc 모듈의 1.1.4 버전을 필요로 한다.
A 프로젝트 개발할땐 1.1.2 버전으로 쓰다 다시 B 프로젝트 개발할땐 1.1.4로 업데이트해서 사용하기도 애매한 상황이다.
이때 venv를 사용하면 아주 깔끔히 해결된다.
venv는 프로젝트 별로 가상의 파이썬 환경을 만들어준다. A라는 venv에는 abc모듈이 1.1.2가 설치하고 B라는 env에는 abc 모듈이 1.1.4가 설치할 수 있게 된다.
일단 설명은 여기까지하고 실제로 설치하고 구경해보자.
1. venv 설치
설치는 간단하다. pip로 virtualenv를 설치해주기만 하면 된다.
참고로 맥북이나 리눅스에는 대부분 기본적으로 python2.7이 설치되어 있다. 하지만 나는 최신버전을 좋아하기 때문에 파이썬 3.7을 별도로 설치해서 사용중이다. 따라서 pip를 쓰지않고 아래와 같이 pip3를 사용했으니 참고하자.
Jiseokui-MacBookPro:~ jiseokwoo$ pip3 install virtualenv
Collecting virtualenv
Using cached https://files.pythonhosted.org/packages/05/f1/2e07e8ca50e047b9cc9ad56cf4291f4e041fa73207d000a095fe478abf84/virtualenv-16.7.9-py2.py3-none-any.whl
Installing collected packages: virtualenv
Successfully installed virtualenv-16.7.9
Jiseokui-MacBookPro:~ jiseokwoo$
2. 가상환경 만들기
이제 프로젝트 A, 프로젝트 B의 가상환경을 각각 만들어보자.
Jiseokui-MacBookPro:~ jiseokwoo$ virtualenv project-A
Using base prefix '/Library/Frameworks/Python.framework/Versions/3.7'
New python executable in /Users/jiseokwoo/project-A/bin/python3.7
Also creating executable in /Users/jiseokwoo/project-A/bin/python
Installing setuptools, pip, wheel...
done.
Jiseokui-MacBookPro:~ jiseokwoo$
Jiseokui-MacBookPro:~ jiseokwoo$
Jiseokui-MacBookPro:~ jiseokwoo$ virtualenv project-B
Using base prefix '/Library/Frameworks/Python.framework/Versions/3.7'
New python executable in /Users/jiseokwoo/project-B/bin/python3.7
Also creating executable in /Users/jiseokwoo/project-B/bin/python
Installing setuptools, pip, wheel...
done.
Jiseokui-MacBookPro:~ jiseokwoo$
실행하면 각각 폴더가 생성될 것이다.
생성된 폴더의 구조를 보면 다음과 같다.
Jiseokui-MacBookPro:~ jiseokwoo$ ls project-A
bin include lib
Jiseokui-MacBookPro:~ jiseokwoo$
- bin : python, pip 등 가상환경의 파이썬 실행 파일들
- include, lib : 가상환경에서 사용하는 라이브러리들
3. 가상환경 접속하기
자 그럼 이제 가상환경에 접속해보자.
먼저 project-A의 가상환경에 접속해보자.
아까 만든 venv 폴더 내의 activate 실행 파일을 통해 접근한다.
Jiseokui-MacBookPro:~ jiseokwoo$ source project-A/bin/activate
(project-A) Jiseokui-MacBookPro:~ jiseokwoo$
접속 후 프롬프트를 보면 (project-A)로 표시된다. 종료는 deactivate를 입력하면 된다.
(project-A) Jiseokui-MacBookPro:~ jiseokwoo$ deactivate
Jiseokui-MacBookPro:~ jiseokwoo$
4. venv별 모듈 확인
자 그럼 project-A에서는 requests를 설치해보고 project-B에서는 paramiko를 설치해본 뒤 pip list를 비교해보자.
- project-A
Jiseokui-MacBookPro:~ jiseokwoo$ source project-A/bin/activate
(project-A) Jiseokui-MacBookPro:~ jiseokwoo$ pip3 install requests
Collecting requests
Using cached requests-2.22.0-py2.py3-none-any.whl (57 kB)
Collecting idna<2.9,>=2.5
Using cached idna-2.8-py2.py3-none-any.whl (58 kB)
Collecting chardet<3.1.0,>=3.0.2
Using cached chardet-3.0.4-py2.py3-none-any.whl (133 kB)
Collecting certifi>=2017.4.17
Using cached certifi-2019.11.28-py2.py3-none-any.whl (156 kB)
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
Using cached urllib3-1.25.7-py2.py3-none-any.whl (125 kB)
Installing collected packages: idna, chardet, certifi, urllib3, requests
Successfully installed certifi-2019.11.28 chardet-3.0.4 idna-2.8 requests-2.22.0 urllib3-1.25.7
(project-A) Jiseokui-MacBookPro:~ jiseokwoo$
(project-A) Jiseokui-MacBookPro:~ jiseokwoo$ pip3 list
Package Version
---------- ----------
certifi 2019.11.28
chardet 3.0.4
idna 2.8
pip 20.0.1
requests 2.22.0
setuptools 45.1.0
urllib3 1.25.7
wheel 0.33.6
(project-A) Jiseokui-MacBookPro:~ jiseokwoo$
- project-B
Jiseokui-MacBookPro:~ jiseokwoo$ source project-B/bin/activate
(project-B) Jiseokui-MacBookPro:~ jiseokwoo$ pip3 install paramiko
Collecting paramiko
Using cached paramiko-2.7.1-py2.py3-none-any.whl (206 kB)
Collecting pynacl>=1.0.1
Using cached PyNaCl-1.3.0-cp34-abi3-macosx_10_6_intel.whl (284 kB)
Collecting bcrypt>=3.1.3
Using cached bcrypt-3.1.7-cp34-abi3-macosx_10_6_intel.whl (53 kB)
Collecting cryptography>=2.5
Using cached cryptography-2.8-cp34-abi3-macosx_10_6_intel.whl (1.6 MB)
Collecting six
Using cached six-1.14.0-py2.py3-none-any.whl (10 kB)
Collecting cffi>=1.4.1
Using cached cffi-1.13.2-cp37-cp37m-macosx_10_6_intel.whl (258 kB)
Collecting pycparser
Using cached pycparser-2.19.tar.gz (158 kB)
Building wheels for collected packages: pycparser
Building wheel for pycparser (setup.py) ... done
Created wheel for pycparser: filename=pycparser-2.19-py2.py3-none-any.whl size=111029 sha256=3ab45789ed7ee33f0a032113ab9c9aa96d2d18e8641c6cff79553cbb19d7e75c
Stored in directory: /Users/jiseokwoo/Library/Caches/pip/wheels/0e/53/27/fee7fd9562e10dd046caccfc0340b8cf789b46846e660f3380
Successfully built pycparser
Installing collected packages: six, pycparser, cffi, pynacl, bcrypt, cryptography, paramiko
Successfully installed bcrypt-3.1.7 cffi-1.13.2 cryptography-2.8 paramiko-2.7.1 pycparser-2.19 pynacl-1.3.0 six-1.14.0
(project-B) Jiseokui-MacBookPro:~ jiseokwoo$
(project-B) Jiseokui-MacBookPro:~ jiseokwoo$ pip3 list
Package Version
------------ -------
bcrypt 3.1.7
cffi 1.13.2
cryptography 2.8
paramiko 2.7.1
pip 20.0.1
pycparser 2.19
PyNaCl 1.3.0
setuptools 45.1.0
six 1.14.0
wheel 0.33.6
(project-B) Jiseokui-MacBookPro:~ jiseokwoo$
그리고 로컬의 pip list도 함께 보자.
Jiseokui-MacBookPro:~ jiseokwoo$ pip3 list
Package Version
---------- -------
pip 19.3.1
setuptools 40.8.0
virtualenv 16.7.9
Jiseokui-MacBookPro:~ jiseokwoo$
이렇게 venv를 사용하면 서로 다른 프로젝트끼리 모듈에 대해 완벽히 분리된 개발 공간을 만들 수 있게 된다.
한번에 하나의 개발 프로젝트만 진행한다 하더라도 venv로 작업하면 추후에 requirement.txt를 작성도 쉽게 정리할 수 있으니 잘 활용해 보자.
끝.