pipenv 공부

파이썬을 이용해서 실험 자동화 스크립트를 짜다가 이런 고민이 들었다.

  • Clean slate 파이썬 환경에서 코드를 돌려볼 수 있을까?
  • 전역 패키지 설정이 아닌, 프로젝트마다 패키지 설정을 만들 수 있을까?

주변인들로 추천받은건 Docker, Conda, pipenv가 있었다.

Docker는 현재 우리 팀의 서버 상황때문에 사용하기 조금 껄끄러웠다.

Conda는 두가지 셋팅이 있는데, Anaconda 셋팅으로 사용하기에는 용량이 너무 크고 (3gb), Miniconda 셋팅을 고려할 수 있었다.
하지만 팀원들이 파이썬에 익숙하지 않아서 ‘제 코드를 실행시키려면 conda라는 패키지를 깔아주세요~’라고 했을 때 별로 좋아하지 않을 가능성이 높았다.
무엇보다 conda의 주 목적은 scientific computing이지, 가상환경 설정이 아니였기 때문에… 다른 가상환경 패키지를 먼저 찾아보게 되었다.


그리고 약 30분 전, pipenv라는 패키지를 알게 되었다.

pipenv 패키지는

  1. pip처럼 파이썬 패키지를 다운받고
  2. 가상환경을 관리할 수 있게 해준다.

딱 내가 원하던거다!

pipenv 이전에는 virtualenv 또는 venv 패키지를 통해서 가상환경을 만들고, 그 내부에서 pip을 사용해서 패키지를 다운로드 받았다고 한다.
하지만 파이썬 3.x 버전으로 넘어온 지금 시점에서는 pipenv가 훨씬 안전하고 편하다고 하니, pipenv를 사용해보기로 한다.


pipenv 설치 + 가상환경 설정

우선 clean state 리눅스에서는 python3는 있지만 pip3는 없다.
터미널에서 sudo apt install python3-pip 명령어를 통해 pip을 설치해준다.
그 후 다시 터미널에서 pip3 install pipenv 명령어를 통해 pipenv를 설치한다.

pipenv가 설치되면, 터미널에서 pipenv shell 명령어를 통해 가상환경을 만들 수 있다.
pipenv shell 명령어를 실행하면, 실행한 위치에서 pipfile이라는 파일이 만들어진다.
pipfile에는 이 가상환경 안에 존재하는 패키지들과 디펜던시 패키지들, 그리고 파이썬 버전이 표기된다.

그리고 터미널을 보면 (python_test) ... 라는 형태가 보이는데, 이는 내가 현재 활성화된 ‘python_test’라는 가상환경 안에 있다는 것을 보여준다.
‘python_test’는 내가 pipenv shell을 실행한 경로의 폴더 이름이다!
신기!

보통의 터미널에서 python --version을 실행하면 python2가 없기 때문에 이런 명령어가 나온다.
하지만 가상환경 안에서 동일한 명령어를 실행하면 자동으로 python3를 찾는다.
왜냐하면 이 가상환경 안에서 python은 우리의 전역설정인 python3 3.8.5이기 때문이다.


패키지 설치

가상환경이 켜진 상태에서는 pipenv install *** 명령어로 패키지를 설치할 수 있다.
예시로 나는 pipenv install numpy를 해봤다.
뱀 이모티콘이 나오면서 numpy가 설치되었다.

pipfile이 업데이트가 되고, pipfile_lock이라는게 생긴다.

pipfile에서 package 부분을 보면 numpy = "*"라는게 생겼다.
*는 최신버전이라는 뜻이다.

pipfile_lock에는 뭔가 복잡한게 생겼다.
대강 내부의 정보는 패키지의 버전 정보, 디펜던시 정보, 디펜던시의 디펜던시 정보가 있다.
pipfile_lock이 있으면 추후에 패키지가 업데이트되면서 내가 사용했던 버전들을 찾기 어려워질 때를 대비할 수 있다.

터미널에서 pipenv lock -r 명령어를 사용해서 pipfile_lock에 저장된 내용들을 확인할 수도 있다.

패키지를 지우려면 pipenv uninstall ***를 하면 된다.

배포할 때 필요하지 않은 패키지는 pipenv install *** --dev 명령어를 사용하면 된다.
이 경우 pipfile에서 ‘dev-packages’에 들어가게 된다.

다른 프로젝트에서 requirements.txt 파일을 가져왔다면, pipenv install -r ./requirements.txt 명령어를 통해 필수 패키지를 한번에 설치할 수 있다.

패키지들의 디펜던시 관계를 보고싶다면 pipenv graph를 사용하면 된다.


배포 준비

배포를 할 때는 pipfile에 적힌것 처럼 최신 버전 (i.e. *)를 사용하는게 아닌, 특정 버전을 명시해야한다.
그렇기 때문에 배포할 때 우리는 pipfile이 아닌 pipfile_lock을 사용한다.
pipenv lock 명령어를 사용해서 pipfile_lock을 업데이트 시킬 수 있다.

pipfile_lock으로부터 패키지 설치를 진행하기 위해서는 pipenv install --ignore-pipfile 명령어를 사용하면 된다.