'Pipenv'로 파이썬 프로젝트를 관리하는 방법

InfoWorld
파이썬(Python)의 패키지 생태계는 다른 수백만 개발자의 작업을 간단한 ‘pip 설치(pip install)’ 명령어로 활용하게 해 준다. 파이썬의 가상 환경은 프로젝트와 그 패키지를 서로 분리하게 해 준다.

그러나 환경과 패키지를 별도로 관리하려면 번거로울 수 있다. 해당 프로젝트에 구체적인 패키지 요건이 있다면 2배로 그렇다. 그리고 유지관리보다는 개발에 집중하고 싶다. 따라서, 환경과 패키지를 같이 관리할 방법이 필요하다. 
 
ⓒDreamstime

Pipenv는 파이썬 가상 환경과 파이썬 패키지의 관리를 도구 하나로 합쳐 준다. 또한, 각 프로젝트가 필요한 각 패키지의 정확한 버전을 사용하는지, 각 패키지에 의존하는지도 확인해 준다.

그뿐만 아니라, Pipenv는 프로젝트와 함께 이동 가능한 의존성 목록을 생성한다. 이를 통해 다른 사용자 또는 개발자는 똑같은 프로젝트를 똑같은 방식으로 설정할 수 있다. Pipenv로 관리되는 프로젝트를 제대로 설정하려면 다른 사용자들 역시 Pipenv를 설치해야 한다. 다행히 Pipenv 설치 및 사용은 식은 죽 먹기다. 

Pipenv 작동 방식
파이썬 프로젝트를 생성하고 그 패키지에 가상 환경을 사용할 때 보통 필요한 작업은 (py -m venv 명령어를 사용해서) 가상 환경을 직접 만들고 그 안에 의존성을 설치한 후 직접 추적하는 것이다.

Pipenv는 이 작업을 모두 반자동으로 할 수 있는 방법을 제공한다. Pipenv의 명령행 인터페이스를 통해 패키지를 설치하면 해당 프로젝트에 대한 가상 환경이 생성되고 관리된다. 무엇에 의존하는지 추적하고, 사용자는 개발 의존성과 런타임 의존성을 따로 관리할 수 있다. 기존의 구식 requirements.txt 파일로부터 이주도 가능하다. 따라서, Pipenv를 잘 사용하기 위해 프로젝트를 해체한 후 처음부터 다시 시작할 필요가 없다.

유의할 점은 다른 파이썬 프로젝트 관리 도구(예: Poetry)와 달리 Pipenv는 프로젝트의 ‘스캐폴딩’은 관리하지 않는다. 즉, Pipenv는 프로젝트 디렉토리의 내부 구조를 모의 테스트, 문서 조각 등으로 만들지 않고 패키지 및 환경 관리에 주로 초점을 맞춘다. 따라서, 모든 기능을 다 갖춘 솔루션이 아니라 그저 가상 환경 및 패키지에 주력하는 도구를 원할 경우에 Pipenv를 선택하면 좋다.
 
ⓒIDG
Pipenv를 사용해 새로 작성된 프로젝트 디렉토리에 패키지 설치 - 패키지가 없는 경우 Pipenv는 가상 환경을 작성하여 패키지를 저장한다.

Pipenv로 시작
Pipenv의 설치 방식은 대부분의 다른 파이썬 패키지와 동일하다(pip install --user pipenv). Pipenv와 다른 시스템 전반 패키지가 서로 충돌하지 않도록 --user 옵션이 권장된다. 또한, 사용자 기반 바이너리 디렉토리에 대한 경로를 시스템 경로에 추가해야 한다. 그래야 Pipenv 명령어가 맞는 장소로 전달된다.

Pipenv를 작업흐름의 지속적인 부분으로 만들 계획이라면, 기본 파이썬 설치를 가능한 한 최소한으로 유지하는 것이 좋다. 가상 환경을 활용하는 대부분의 파이썬 설치에 해당되는 말이다.

Pipenv로 신규 프로젝트 설정
Pipenv로 완전히 새로운 프로젝트를 시작하려면, 디렉토리를 하나 만든 후에 보통 때 프로젝트를 위해 생성하는 파일로 채우면 된다. 프로젝트를 진행하면서 스캐폴딩을 하는 경향이 있다면 텅 빈 디렉토리로 시작해도 된다.

프로젝트를 위한 패키지 설치 방식은 Pip를 사용하나 Pipenv를 사용하나 큰 차이가 없다. 사실 구문은 거의 같다. 해당 프로젝트 디렉토리에서 콘솔을 연 후 ‘pipenv install <package_name>’을 입력하면 해당 프로젝트를 위한 패키지가 설치된다. 그 패키지가 ‘개발’용임을 명시하려면 -d 플래그를 사용한다. pip 구문을 사용하면 패키지의 특정 버전을 나타낼 수 있다(예: (e.g., black==13.0b1).

Pipenv로 패키지를 설치하면 2가지 일이 발생한다. 첫째, 이 프로젝트에 이미 생성된 가상 환경이 있는지 확인이 이루어진다. 이미 가상 환경이 생성되어 있다면 해당 가상 환경 내에 패키지가 설치된다. 생성된 가상 환경이 없다면 Pipenv 실행에 똑같은 에디션의 파이썬을 사용하는 가상 환경이 생성된다. 유의할 점은 가상 환경이 프로젝트 디렉토리 자체에 생성되는 것이 아니라 사용자 프로필에서 Pipenv이 관리하는 디렉토리에 생성된다는 점이다.

둘째, 요청된 패키지가 가상 환경에 설치된다. 설치가 완료되면 설치 완료 사실이 보고된다. 만일 가상 환경을 생성해야 했다면 그에 대한 경로도 보고된다.

Pipenv에서 생성한 가상 환경 경로는 대개 알 필요가 없다. 가상 환경을 활성화하려면 프로젝트 디렉토리로 찾아가서 ‘pipenv shell’을 사용해 새로운 셸 세션을 시작하거나 ‘pipenv run <명령어>’를 사용해 명령어를 직접 실행하면 된다. 예를 들면, pipenv run mypy를 사용해 mypy의 명령행 도구 버전을 실행하거나(mypy 도구가 가상 환경에 설치된 경우) ‘pipenv run python -m <모듈>’을 사용해 가상 환경에 있는 파이썬 모듈을 실행할 수 있다.

Pipenv와 lock 파일
Pipenv로 패키지를 설치한 후에 디렉터리 내부를 들여다보면 2개의 파일(PipfilePipfile.lock)이 보일 것이다. 둘 다 Pipenv에 의해 자동으로 생성된 것이다. 프로젝트 내 패키지의 상태를 설명하는 파일이므로 직접 편집해서는 안 된다.

두 파일 중 더 간단한 것은 Pipfile이다. 이 파일에 포함된 내용은 프로젝트에 필요한 패키지와 그 패키지가 어디에서 설치되었으며(기본값은 PyPI), 모든 것을 실행하려면 어떤 파이썬 버전이 필요한지 뿐이다. 반면, Pipfile.lock는 좀더 복잡하다. 각 패키지와 더불어 버전 세부내용, 그리고 패키지에서 생성된 SHA-256 해시가 포함되어 있다. 이 해시의 용도는 설치된 패키지가 명시된 내용과 ‘정확히’ 일치하는지 확인하는 것이다. 즉, 단순히 버전 번호만이 아니라 입수한 내용 역시 일치해야 한다.

패키지 관리에 Pipenv를 사용하는 프로젝트 작업을 할 때는 Pipfile 파일과 Pipfile.lock 파일을 해당 프로젝트의 버전 통제 보관소에 추가하는 것이 좋다. 해당 프로젝트의 패키지에 변경사항이 생기면 Pipfile 파일과 Pipfile.lock 파일도 결국 변경되기 때문에 변경사항은 버전을 매겨 추적해야 한다.

Pipenv 프로젝트 사용
패키지 관리에 Pipenv를 사용하는 프로젝트를 위해 소스 보관소를 다운로드하는 경우라면 보관소의 내용물을 디렉토리에 풀어 넣은 후에 ‘pipenv install’을 실행하기만 하면 된다(패키지 이름은 필요 없음). 프로젝트에 대한 Pipfile 파일 및 Pipfile.lock 파일이 판독되고 가상 환경이 생성되며 필요에 따라 의존성이 모두 설치된다.

마지막으로, 현재 requirements.txt 파일을 사용하는 프로젝트를 Pipenv로 관리하고 싶다면, 해당 프로젝트의 디렉토리로 찾아가서 ‘pipenv install’을 실행하면 된다. 그러면 해당 requirements.txt 파일이 감지되고(아니면 -r 플래그를 사용하여 해당 파일을 지시할 수도 있다) 요건 전체가 Pipfile 내부로 이동된다. ciokr@idg.co.kr