Pipenv & 가상 환경(Virtual Environments)

../_images/35294660055_42c02b2316_k_d.jpg

이 튜토리얼은 Python 패키지 설치 및 사용을 안내합니다.

필요한 도구를 설치 및 사용하고 best practice의 강력한 권장 사항을 제시하는 방법을 알려드릴게요. Python은 매우 다양한 용도로 사용되며, 소프트웨어 퍼블리싱 방법에 따라 종속성을 관리하는 방법이 달라질 수 있습니다. 여기에 제시된 지침은 네트워크 서비스(웹 애플리케이션 포함)의 개발과 배포에 가장 직접적으로 적용되지만, 모든 종류의 프로젝트에 대한 개발 및 테스트 환경 관리에도 매우 적합합니다.

주석

이 안내서 파이썬3를 대상으로 작성되었습니다. 하지만 이 안내사항은 파이썬 2.7에서도 잘 적용됩니다. 어떤 이유에서든 아직도 그걸 쓰고 있다면 말이지요.

Python과 pip가 있는지 확인하기

더 진행하기 전에 파이썬이 설치되어 있는지, 커맨드라인에서 사용할 수 있는지 확인하십시오. 이 기능은 간단히 아래 명령어를 실행하기만 하면 확인할 수 있습니다.

$ python --version

3.6.2 같은 출력이 나와야 합니다. 파이썬이 없는 경우, python.org 에서 최신 3.x 버전을 설치하거나 이 가이드의 Installing Python 섹션을 참조하십시오.

주석

초심자이고 이런 에러가 나왔다면:

>>> python
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'python' is not defined

이 명령은 ( 터미널 또는 콘솔 이라고도 함)에서 실행되도록 되어 있기 때문입니다. 운영 체제의 셸 사용 및 Python과의 상호 작용에 대한 자세한 내용은 getting started tutorial 자습서를 참조하십시오.

추가로 pip 가 동작하는지 확인해야 할 필요가 있을겁니다. 아래 명령어로 확인할 수 있습니다:

$ pip --version

소스에서 Python을 설치하거나 python.org 의 설치 프로그램을 사용하거나 Homebrew 를 통해 Python을 설치한 경우 이미 pip이 있어야 합니다. Linux 사용자이고 OS 패키지 관리자를 사용하여 설치한 경우 pip 설치 를 별도로 해야 할 수 있습니다.

Pipenv 설치하기

Pipenv 는 Python 프로젝트의 종속성 관리자입니다. 만약 여러분이 Node.js의 npm`_이나 Ruby의 `bundler 에 익숙하다면, Pipenv는 그 도구들과 비슷한 사상으로 만들어졌습니다. Pip은 Python 패키지를 설치할 수 있지만 Pipenv는 일반적인 사용 사례에 대한 의존성 관리를 단순화하는 고급 도구로서 하용하기를 권장합합니다.

``pip``로 Pipenv를 설치하자:

$ pip install --user pipenv

주석

이렇게 하면 시스템 전체 패키지가 박살나지 않도록 user installation 를 수행할 수 있습니다. 설치 후 셸에서 pipenv 를 사용할 수 없는 경우 user base 의 바이너리 디렉토리를 PATH 에 추가해야 합니다.

Linux 및 macOS에서는 python -m site --user-base 를 실행하고 끝에 bin 을 추가하면 사용자 베이스 바이너리 디렉토리를 찾을 수 있습니다. 예를 들어, 일반적으로 ~/.local 에서 ~ 는 홈 디렉토리의 절대 경로로 인식되므로 PATH 에 ~/.local/bin을 추가해야 합니다. ~/.profile 를 수정하여 PATH 를 영구적으로 설정할 수 있습니다.

윈도우즈에서 py -m site --user-site 를 실행하고 site-packagesScripts 로 바꾸면 사용자 베이스 바이너리 디렉토리를 찾을 수 있습니다. 예를 들어 C:\Users\Username\AppData\Roaming\Python36\site-packages 가 리턴하기 위하여 PATHC:\Users\Username\AppData\Roaming\Python36\Scripts 를 추가해야 합니다. 제어판 에서 사용자 PATH 를 영구적으로 설정할 수 있습니다. PATH 변경 사항을 적용하려면 로그아웃해야 할 수도 있습니다.

프로젝트에 패키지 설치하기

Pipenv는 프로젝트별로 종속성을 관리합니다. 패키지를 설치하려면 프로젝트의 디렉터리(또는 이 튜토리얼의 빈 디렉터리만)로 이동하여 다음 명령을 실행하십시오.

$ cd project_folder
$ pipenv install requests

Pipenv가 멋진 Requests 라이브러릴 설치했습니다. 긜고 프로젝트 디렉터리에 Pipfile 을 만듭니다. Pipfile 은 프로젝트를 다른 사용자와 공유할 때와 같이 프로젝트를 다시 설치해야 하는 경우 프로젝트에 필요한 종속성을 추적하는 데 사용됩니다. 아래와 유사한 출력을 얻어야 합니다(표시된 정확한 경로는 다르지만).

Creating a Pipfile for this project...
Creating a virtualenv for this project...
Using base prefix '/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6'
New python executable in ~/.local/share/virtualenvs/tmp-agwWamBd/bin/python3.6
Also creating executable in ~/.local/share/virtualenvs/tmp-agwWamBd/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: ~/.local/share/virtualenvs/tmp-agwWamBd
Installing requests...
Collecting requests
  Using cached requests-2.18.4-py2.py3-none-any.whl
Collecting idna<2.7,>=2.5 (from requests)
  Using cached idna-2.6-py2.py3-none-any.whl
Collecting urllib3<1.23,>=1.21.1 (from requests)
  Using cached urllib3-1.22-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Using cached chardet-3.0.4-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests)
  Using cached certifi-2017.7.27.1-py2.py3-none-any.whl
Installing collected packages: idna, urllib3, chardet, certifi, requests
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22

Adding requests to Pipfile's [packages]...
P.S. You have excellent taste! ✨ 🍰 ✨

설치된 패키지 사용하기

이제 Requests가 설치되었으므로 간단한 main.py 파일을 작성하여 사용할 수 있습니다.

import requests

response = requests.get('https://httpbin.org/ip')

print('Your IP is {0}'.format(response.json()['origin']))

그런 다음 pipenv run 를를 사용하여 이 스크립트를 실행할 수 있습니다.

$ pipenv run python main.py

아래와 비슷한 결과를 얻어야 합니다:

Your IP is 8.8.8.8

$ pipenv run 를 사용하면 설치된 패키지를 스크립트에서 사용할 수 있습니다. 또한 $ pipenv shell 을 사용하여 실행하는 모든 명령이 설치된 패키지에 액세스할 수 있도록 하는 새 셸을 생성할 수도 있습니다.

다음 단계

축하해요! 이제 파이썬 패키지를 설치하고 사용하는 방법을 익혔습니다! ✨ 🍰 ✨

하위계층: virtualenv

virtualenv 는 격리된 파이썬 환경을 만들기 위한 도구이다. virtualenv는 Python 프로젝트에 필요한 패키지를 사용하는 데 필요한 모든 실행 파일이 포함된 폴더를 생성합니다.

Pipenv 대신 단독으로 사용할 수 있습니다.

pip로 virtualenv를 설치하자:

$ pip install virtualenv

설치가 잘 됐는지 확인하자:

$ virtualenv --version

기본 사용법

  1. 프로젝트에 가상 환경을 생성하자:
$ cd project_folder
$ virtualenv venv

virtualenv venv 는 파이썬 실행 파일이 들어있는 현재 디렉토리에 폴더를 하나 만들고 pip 라이브러리(다른 패키지를 설치하는 데 사용할)의 복사본을 만듭니다.가상 환경의 이름(여기서는 venv)은 뭐든 가능합니다. 그리고 이름을 생략하면 파일이 대신 현재 디렉토리에 배치됩니다.

주석

'venv' 는 전세계적으로 사용되는 일반적인 컨벤션입니다. ignore 파일에서 쉽게 처리 가능합니다(예: .gitignore).

이렇게 하면 명령을 실행한 디렉터리에 Python의 복사본이 생성되어 venv 라는 폴더에 저장됩니다.

python2.7 과 같은 Python 인터프리터를 선택해서 사용할 수도 있습니다.

$ virtualenv -p /usr/bin/python2.7 venv

아니면 ~/.bashrc 로 전역 환경에서 인터프리터 환경 변수를 바꿀 수도 있습니다.

$ export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python2.7
  1. 가상 환경 사용을 시작하려면 가상 환경을 활성화해야 합니다.
$ source venv/bin/activate

현재 가상 환경의 이름이 프롬프트 왼쪽에 나타납니다(예: (venv)Your-Computer:project_folder UserName$)이것이 가상환경이 활성화되어 있음을 알려 줍니다. 이제부터 pip을 사용하여 설치하는 모든 패키지는 글로벌 Python 설치환경과 격리된 venv 폴더에 배치됩니다.

윈도우즈의 경우 1단계에서 언급한 동일한 명령을 사용하여 가상 환경을 생성할 수 있습니다. 그러나 가상상환경을 활성화하려면 약간 다른 명령이 필요합니다.

프로젝트 디렉토리에 있다고 가정하고 시작해보면 이렇습니다:

C:\Users\SomeUser\project_folder> venv\Scripts\activate

pip 명령으로 패키지를 설치해봅시다:

$ pip install requests
  1. 잠시 가상환경에서의 작업을 멈추려면 이렇게 비활성화 할 수도 있습니다:
$ deactivate

이렇게 하면 설치된 모든 라이브러리와 함께 시스템의 기본 Python 인터프리터로 돌아갑니다.

가상 환경을 삭제하려면 해당 폴더를 삭제하십시오. (이 경우, rm -rf venv)

개발을 오래 하다보면 시스템 전체에 많은 가상 환경이 흩어져 있을 수 있습니다. 그러다보면 가상환경의 이름이나 위치가 기억나지 않을 수도 있습니다. (역주: 그래서 어쩌라는 거임... 이름을 venv로 하는 게 좋다고?)

주석

파이썬3.3 버전부터는 venv 모듈을 포함하고 있다. 자세한 내용은 venv.

기타 참고 사항

--no-site-packages 옵션을 줘서 virtualenv 를 실행하면 전역환경에 설치된 파이썬 패키지를 가져오지 않습니다. 나중에 다시 쓸 패키지 리스트를 깔끔하게 유지하는 데 유용합니다. [virtualenv 1.7 이후부터는 이게 기본 동작입니다.]

개발환경을 일관성 있게 유지하려면 개발환경 패키지의 현재 상태를 "freeze" 하는 것이 좋습니다. 이렇게 하려면 다음을 실행합니다.

$ pip freeze > requirements.txt

그러면 requirements.txt 파일이 생성됩니다. 이 파일에는 현재 환경의 모든 패키지와 해당 버전의 단순한 목록이 적혀있습니다.requirements 포맷을 쓰지 않더라도 pip list 로 ㅎ녀재 설치되어 있는 패키지 목록을 확인할 수 있습니다. 이것이 나중에 다른 개발자가 동일한 버전을 사용하여 동일한 패키지를 설치하는 작업(또는 환경을 다시 만들어야 하는 경우)을 더 쉽게 만들어줍니다.

$ pip install -r requirements.txt

위 명령을 통해 설치본, 배포본 및 개발자 간에 개발환경의 일관성을 유지할 수 있습니다.

마지막으로 가상 환경 폴더를 ignore 목록에 추가하여 소스 컨트롤 도구에서 제외해야 합니다(참고하세요 버전 컨트롤 ignore).

virtualenvwrapper

virtualenvwrapper 는가상 환경에서의 작업을 훨씬 더 즐겁게 해주는 일련의 명령을 제공합니다. 또한 모든 가상 환경을 한 곳에 배치합니다.

설치하려면(virtualenv 가 먼저 설치되어 있는지부터 확인하시고):

$ pip install virtualenvwrapper
$ export WORKON_HOME=~/Envs
$ source /usr/local/bin/virtualenvwrapper.sh

(Full virtualenvwrapper install instructions.)

윈도우즈에서는 virtualenvwrapper-win 를 사용할 수 있습니다.

설치하려면(virtualenv 가 먼저 설치되어 있는지부터 확인하시고):

$ pip install virtualenvwrapper-win

Windows에서는 WORKON_HOME 의 기본 path가 %USERPROFILE%Envs 입니다.

기본 사용법

  1. 가상 환경 생성:
$ mkvirtualenv project_folder

이건 ~/Envs 안에 project_folder 폴더를 만듭니다.

  1. 가상환경에서 작업하기:
$ workon project_folder

대신 가상환경을 생성하고, workon project_folder 명령을 하기 전의 위치인 $WORKON_HOME 디렉토리 안에 프로젝트 디렉토리를 생성할 수도 있습니다.

$ mkproject project_folder

virtualenvwrapper 는 환경 이름의 tab-자동완성 기능을 지원합니다. 이건 아주 많은 환경이 있고 각각의 이름을 기억하는게 힘들 때 아주 도움이 됩니다.

workon 은 현재 어느 디렉토리에서 작업하고 있든 가상환경을 비활성화 할 수 있습니다. 덕분에 환경 간 전환을 빠르게 할 수 있습니다.

  1. 비활성화 하는 방법은 똑같습니다:
$ deactivate
  1. 삭제하려면:
$ rmvirtualenv venv

기타 유용한 명령어

lsvirtualenv
모든 환경의 목록을 보여준다.
cdvirtualenv
현재 활성화 된 가상 환경의 디렉토리로 이동한다. 그리하여 site-packages 같은 것들을 확인할 수 있다.
cdsitepackages
위와 비슷하지만 site-packages 디렉토리로 바로 이동한다.
lssitepackages
site-packages 디렉토리의 내용물을 보여준다.

virtualenvwrapper 명령어의 전체 목록.

virtualenv-burrito

virtualenv-burrito 를 사용하면 명령어 한 방으로 virtualenv 와 virtualenvwrapper 를 함께 사용할 수 있다.

direnv

.env 가 있는 디렉토리로 cd 할 때 direnv 는 자동으로 가상환경을 활성화한다.

brew 로 Mac OS X에 설치해보자:

$ brew install direnv

리눅스라면 direnv.net 를 참고하자.