본문 바로가기

Language/PYTHON

[Python] pipenv 란 무엇인가

pip, virtualenv, 귀찮지 않으세요?

python을 사용하면서 당연하게도 사용하게 되는 두가지가 있다.

첫번째는 pip이다. python을 이용하며 사용하게 되는 패키지 관리 툴이다. 프로그램을 만들 때, 의도하지 않는 이상, 다양한 패키지를 사용하게 된다. 이때 pip를 활용하여 여러가지 패키지들을 설치할 수 있다.

두번째는 virtualenv이다. python으로 개발을 하게 되면 거의 항상 복수의 패키지를 설치하여 사용하게 된다. 하지만 각각의 프로젝트가 요구하는 패키지들의 상세 내용이 다를 수 있다.

가령 A라는 프로젝트는 특정 패키지의 1.0 버전을 사용하고 있었지만, B라는 프로젝트는 특정 패키지의 2.0버전을 사용하는 경우가 발생한다. 이때 각각의 프로젝트를 빌드하기 위해서 서로 번갈아가며 패키지를 설치했다 지웠다하는 생각은 버리도록 하자. pandas와 같은 패키지를 사용하면 알겠지만, 시간이 많이 소요된다.

그렇기 때문에 각각의 프로젝트 내 개발 환경을 구축하는 것이 제일 이상적이다. 이를 지원하는 것이 virtualenv이다. virtualenv는 프로젝트별로 고립된 개발환경을 구축하게 해주기 때문에 A 프로젝트와 B 프로젝트를 따로 의식하면서 패키지를 특정 환경에 맞게 설치했다 지웠다 하지 않으며 개발할 수 있게 된다.

하지만 여기서 문제가 발생한다. 첫번째는 pip는 패키지들을 설치하는데 있어서 여간 귀찮지 않을 수 없다. 먼저 pip를 하나씩 설치를 하자니 시간이 많이 들게 된다. 그래서 requirements.txt라는 파일을 통해 통으로 패키지들을 관리할 수 있도록 지원하고 있다. 하지만 문제점은 requirements.txt를 버전을 명시하지 않고 작성하였을때, 오늘과 내일의 설치가 똑같다는 보장이 없으며 정확히 버전을 일일이 기재를 하자니 또한 귀찮아진다. (참조 1)

이마저도 pip의 고비를 넘기기 전에 virtualenv를 설치해야 한다는 점도 까먹지 말자. 결론은 매번 환경 설정을 의식해야 하는것들이 많기 때문에 여러모로 귀찮다는 점이다.

pipenv의 등장

이런 이유들로 인해 등장한 것이 pipenv이다. 이름만으로도 느낌이 오지 않는가? pip와 virtualenv가 합쳐진 것이다.

pipenv는 Python.org에서 공식적으로 권장하는 패키지 설치 툴이다. Pipenv는 파이썬으로 들어가는 세계 속 패키징 설치 경험을 최상으로 제공하고자 노력한다고 써있다. Pipenv는 또한 아래와 같이 문제들을 해결하려고 하였다.

  • pip와 virtualenv를 따로 쓸 필요가 없다. 동시에 사용이 된다.
  • Pipenv는 Pipfile와 Pipfile.lock을 requirements.txt를 대신하여 사용한다.
  • 해쉬가 자동생성된다. (보안)
  • 의존성 그래프를 제공함으로서 insight를 제공한다 (e.g. $ pipenv graph).
  • .env 파일들을 사용한 스트림라인 개발 워크플로우

기본 특징은 다음과 같다.

  • 필요한 것만 정의하면서, 결정론적인(deterministic, 파일에 정의된대로) 빌드가 가능하다.
  • 락이 걸린 의존성에 대해 해쉬 파일을 생성하고 확인한다.
  • pyenv가 사용 가능하다면, 필요한 python도 자동으로 설치한다.
  • Pipfile을 찾으면서자동으로 프로젝트 홈을 찾아준다.
  • Pipfile이 없다면 자동으로 생성해준다.
  • 자동으로 virtualenv 환경을 생성한다.
  • 패키지를 설치/삭제하면, 자동으로 Pipfile에서 추가/삭제한다.
  • 자동으로 .env 파일을 인식한다.

pipenv 사용법

참조 : https://github.com/pypa/pipenv

가볍게 맥을 기준으로 사용법을 안내한다.

$ brew install pipenv

를 terminal에 입력하여 설치하도록 하자. 이후

pipenv --python 3.6

를 명령어를 치면 python 3.6버전을 기준으로 한 프로젝트가 생성된다. 이후는 pipenv를 사용하여 기존 패키지들을 pip처럼 설치하는 것 뿐이다.

pipenv shell

또한 pipenv 내 가상환경을 사용하는 것은 위와 같다. 이외 자세한 사용법은 아래와 같다.

$ pipenv
Usage: pipenv [OPTIONS] COMMAND [ARGS]...

Options:
--where Output project home information.
--venv Output virtualenv information.
--py Output Python interpreter information.
--envs Output Environment Variable options.
--rm Remove the virtualenv.
--bare Minimal output.
--completion Output completion (to be eval'd).
--man Display manpage.
--three / --two Use Python 3/2 when creating virtualenv.
--python TEXT Specify which version of Python virtualenv should use.
--site-packages Enable site-packages for the virtualenv.
--version Show the version and exit.
-h, --help Show this message and exit.


Usage Examples:
Create a new project using Python 3.6, specifically:
$ pipenv --python 3.6

Install all dependencies for a project (including dev):
$ pipenv install --dev

Create a lockfile containing pre-releases:
$ pipenv lock --pre

Show a graph of your installed dependencies:
$ pipenv graph

Check your installed dependencies for security vulnerabilities:
$ pipenv check

Install a local setup.py into your virtual environment/Pipfile:
$ pipenv install -e .

Use a lower-level pip command:
$ pipenv run pip freeze

Commands:
check Checks for security vulnerabilities and against PEP 508 markers
provided in Pipfile.
clean Uninstalls all packages not specified in Pipfile.lock.
graph Displays currently–installed dependency graph information.
install Installs provided packages and adds them to Pipfile, or (if none
is given), installs all packages.
lock Generates Pipfile.lock.
open View a given module in your editor.
run Spawns a command installed into the virtualenv.
shell Spawns a shell within the virtualenv.
sync Installs all packages specified in Pipfile.lock.
uninstall Un-installs a provided package and removes it from Pipfile.

Pipenv를 활용하여 편리하고도 쉬운 개발환경 세팅하기를 바란다.