pipenv 공부
파이썬을 이용해서 실험 자동화 스크립트를 짜다가 이런 고민이 들었다.
- Clean slate 파이썬 환경에서 코드를 돌려볼 수 있을까?
- 전역 패키지 설정이 아닌, 프로젝트마다 패키지 설정을 만들 수 있을까?
주변인들로 추천받은건 Docker, Conda, pipenv가 있었다.
Docker는 현재 우리 팀의 서버 상황때문에 사용하기 조금 껄끄러웠다.
Conda는 두가지 셋팅이 있는데, Anaconda 셋팅으로 사용하기에는 용량이 너무 크고 (3gb), Miniconda 셋팅을 고려할 수 있었다.
하지만 팀원들이 파이썬에 익숙하지 않아서 ‘제 코드를 실행시키려면 conda라는 패키지를 깔아주세요~’라고 했을 때 별로 좋아하지 않을 가능성이 높았다.
무엇보다 conda의 주 목적은 scientific computing이지, 가상환경 설정이 아니였기 때문에… 다른 가상환경 패키지를 먼저 찾아보게 되었다.
그리고 약 30분 전, pipenv
라는 패키지를 알게 되었다.
pipenv 패키지는
- pip처럼 파이썬 패키지를 다운받고
- 가상환경을 관리할 수 있게 해준다.
딱 내가 원하던거다!
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
명령어를 사용하면 된다.