본문 바로가기
프로그래밍

파이썬 버전관리, pipenv를 이용한 개발환경관리

by K-인사이터 2024. 3. 21.
반응형

안녕하세요
K-인사이트 입니다. 
 

 

Maven, Gradle 처럼 파이썬 프로젝트의 버전 관리의 필요성을 느끼는 분들이 많을 것입니다. 예를 들어 특정 파이썬 인터프리터 버전을 고정해서 사용하고 싶거나 프로젝트에 최적화된 라이브러리 버전들을 픽스해둔 경우가 그렇습니다. 파이썬 프로젝트는 광활한 에코시스템을 가지고 있고 이를 통해 생산성을 배가하는 구조입니다. 그렇기에 이러한 라이브러리의 버전관리는 매우 중요한 요소입니다.

 

이번에는 pipenv 도구를 활용해서 버전을 관리하고 프로젝트 공유 및 다운로드 과정에서 발생하는 자질구레한 설치 이슈들을 한방에 잡는 솔루션을 알아보겠습니다. 

 

pipenv 란? 

파이썬에서 공식으로 권장하는 패키지 관리 툴인 파이프니브(pipenv)는 가상 환경 관리 도구이기도 합니다. 파이썬 버전까지 명시할 수 있어 관리에 용이하고, 여러 패키지의 의존성과 버전 관리를 해줄 수 있는 효용이 있습니다. 다만, 단점으로는 의존성 그래프를 항시 관리하기 때문에 pyenv 혹은 virtualenv 에 비해 패키지 설치가 상대적으로 오래걸리게 됩니다. 

 

pipenv 설치 방법

pipenv 는 pip 를 통해서 설치가 가능합니다. 공식문서에서는 3.7버전 이상을 기준으로 하기 때문에 이점을 유의하시면 됩니다. 또한, 맥OS 를 사용하고 있다면 Homebrew 를 통해서 설치가 가능합니다. 공식 문서를 확인하고자 한다면 아래의 링크를 참조해주세요. 

🔗 https://pipenv.pypa.io/en/latest/installation.html

 

Pipenv Installation — pipenv 2023.11.16.dev0 documentation

It is recommended that users on most platforms install pipenv from pypi.org using Note pip user installations allow for installation into your home directory to prevent breaking any system-wide packages. Due to interaction between dependencies, you should

pipenv.pypa.io

 

아래 명령어를 통해서 간편하게 설치를 할 수 있습니다. 

# pip 를 이용한 설치 방법 python>=3.7
$ pip install pipenv --user # pip 를 이용한 pipenv 설치 방법입니다. 
$ pip install --user --upgrade pipenv # pipenv 를 업그레이드 하고자한다면 이 명령어를 사용해주세요.

# Homebrew 를 이용한 설치 방법
$ brew install pipenv
$ brew upgrade pipenv

 

프로젝트를 생성할 때 사용방법

프로젝트를 시작하기 위해 폴더를 생성하게되면 아래의 방법으로 가상환경을 구성하게됩니다. 

  1. 파이썬 버전을 결정
  2. 필요한 라이브러리를 설치 
  3. 라이브러리의 버전을 기록
  4. 다른 사용자가 공유된 프로젝트를 클론하여 환경 복원 

위 과정을 pipenv 도구를 이용해서 재현해보겠습니다. 여기서 주의할 점은 pipenv install 명령어를 통해서 패키지를 설치할 경우 자동으로 의존성 그래프를 관리하게됩니다. 만약 실수로 pip install 을 사용한 경우는 의존성 그래프가 생성되지 않습니다. 따라서, 다시 pipenv install 명령어를 통해서 설치가 필요합니다. pipenv lock 명령어는 Pipfile.lock 파일을 생성하며 의존성 정보와 hash 정보들을 기록합니다. 이를 통해 위변조된 파일의 다운로드를 방지합니다. 

mkdir ./project_folder
cd ./project_folder
pipenv --python 3.9 # python 3.9 가상환경 구성
pipenv shell # python 가상환경 활성화
pipenv install 'aiohttp<=3.9.2' # 필요한 패키지 정보를 설치
pipenv lock # 현재의 환경을 저장합니다.

 

프로젝트를 불러와서 환경을 세팅할 때 사용방법

동료가 프로젝트를 생성해서 깃헙을 통해서 공유를 해주었습니다. Pipfile 그리고 Pipfile.lock 파일이 보입니다. 이때, 단 두가지 명령만 있다면 동료의 환경을 그대로 복제해낼 수 있습니다. 

$ git clone https://k-in@bitbucket.org/kinstory/cve-2024-23334.git # repo를 클론합니다. 
$ cd cve-2024-23334 # 프로젝트에 접근합니다.
$ pipenv install # 가상환경과 라이브러리를 설치합니다
$ python # 파이썬 버전과 라이브러리가 정상적으로 설치되었습니다. 
Python 3.9.16 (main, Mar 21 2024, 06:09:26) 
[Clang 15.0.0 (clang-1500.1.0.2.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import aiohttp
>>>

 

의존성 관리 방법

성숙하지 않은 단계의 라이브러리를 사용하다보면 혹은 다른 라이브러리에 의존성이 높은 라이브러리를 사용하는 경우 의존성 문제가 발생할 수 있습니다. 예를 들어 pandas 라이브러리를 사용하는데 최신의 numpy 라이브러리가 필요하여 업데이트를 하였는데 pandas가 제대로 구동되지 않는 케이스가 대표적입니다. 

 

이 경우 의존성 그래프를 확인하여 대응할 수 있습니다. pipenv graph 명령어를 사용해서 라이브러리가 어떤 라이브러리를 사용하고 있는지를 세부적으로 파악할 수 있습니다. 이를 통해 문제가되는 pandas 등의 라이브러리를 업데이트하거나 다시 numpy 라이브러리를 다운그레이드하는 방향을 검토해볼 수 있습니다. 

% pipenv graph           
aiohttp==3.9.1
├── aiosignal [required: >=1.1.2, installed: 1.3.1]
│   └── frozenlist [required: >=1.1.0, installed: 1.4.1]
├── async-timeout [required: >=4.0,<5.0, installed: 4.0.3]
├── attrs [required: >=17.3.0, installed: 23.2.0]
├── frozenlist [required: >=1.1.1, installed: 1.4.1]
├── multidict [required: >=4.5,<7.0, installed: 6.0.5]
└── yarl [required: >=1.0,<2.0, installed: 1.9.4]
    ├── idna [required: >=2.0, installed: 3.6]
    └── multidict [required: >=4.0, installed: 6.0.5]
requests==2.31.0
├── certifi [required: >=2017.4.17, installed: 2024.2.2]
├── charset-normalizer [required: >=2,<4, installed: 3.3.2]
├── idna [required: >=2.5,<4, installed: 3.6]
└── urllib3 [required: >=1.21.1,<3, installed: 2.2.1]

 

맺음말

이상으로 pipenv 를 활용하여 프로젝트 생성 및 복원 그리고 의존성 충돌 시 확인하는 방법을 알아보았습니다. 파이썬 진영의 공식 지원을 받는 패키지인 만큼 신뢰성을 보장하는 차원의 기능을 포함하고 있습니다. 앞으로 virtualenv, pyenv 등이 사라지고 하나의 표준이 자리잡아서 모두가 혼동 없이 파이썬 개발을 즐길 수 있기를 바랍니다. 

 

소개되지 않은 사용법은 공식 홈페이지를 통해서 최신 정보를 확인할 수 있습니다. 

🔗 https://pipenv.pypa.io/en/latest/index.html

 

Pipenv: Python Dev Workflow for Humans — pipenv 2023.11.16.dev0 documentation

 

pipenv.pypa.io

 

이상입니다.

K-인사이트올림. 

반응형