pip 대신에 uv 사용하기
pip
는 파이썬 패키지 관리자로 유용하지만 아래와 같은 몇 가지 근본적인 문제가 있습니다. 특히 패키지 의존성과 환경 관리는 문제가 터지면 해결하기가 아주 어렵습니다.
1 pip이 가지는 문제
- 의존성 충돌 (Dependency Conflicts)
여러 패키지를 설치할 때 각 패키지가 서로 다른 버전의 동일한 종속성을 요구할 경우 의존성 충돌이 발생하며 프로젝트에서 예기치 않은 동작이나 오류를 발생시킬 수 있습니다.
- 글로벌 설치 문제
기본적으로 pip
는 전역 파이썬 환경에 패키지를 설치합니다. 이로 인해, 여러 프로젝트에서 동일한 패키지 버전을 공유하게 되어 프로젝트 간에 종속성 충돌이 발생할 수 있습니다. 특히, 프로젝트마다 요구되는 패키지 버전이 다른 경우에 문제가 됩니다.
- 환경 관리의 어려움
pip
는 파이썬 환경을 별도로 관리하지 않으므로 전역 환경에 설치된 패키지들이 서로 영향을 미칠 수 있습니다. 이로 인해, 동일한 시스템에서 여러 프로젝트를 작업할 때 각 프로젝트의 요구 사항을 일관되게 유지하기 어려워집니다. 이를 해결하기 위해 virtualenv
와 같은 도구를 사용해 가상 환경을 생성해야 합니다.
- 보안 문제
pip
는 기본적으로 모든 패키지를 신뢰합니다. 악의적인 사용자가 배포한 패키지가 PyPI 에 업로드되면, 이를 설치하는 과정에서 보안 문제가 발생할 수 있습니다.
- 복잡한 패키지 관리
복잡한 프로젝트에서는 수많은 패키지와 버전들을 관리해야 하는데, pip
는 기본적으로 이러한 복잡한 종속성 트리를 관리하는 데 최적화되어 있지 않습니다. 이는 특정 패키지 설치 시 종속성 문제가 발생할 때 수동으로 해결해야 하는 번거로움으로 이어질 수 있습니다. 이러한 문제들로 인해, 많은 개발자들이 pipenv
또는 poetry
같은 도구들을 사용하여 환경과 패키지 관리를 하고 있습니다.
2 uv 소개
uv
(Unified Python packaging) 는 Rust
로 작성된 pip
워크플로우를 대체하는 매우 빠른 파이썬 패키지 설치 프로그램입니다. 캐싱 없이 pip
보다 8-10 배 빠르며, 캐시가 있을 때는 80-115 배 빠릅니다. 또한 전역 모듈 캐시를 사용하여 의존성을 다시 다운로드하거나 빌드하지 않고 디스크 공간 사용을 최소화합니다.
특징
- ⚖️ 일반적인
pip
,pip-tools
,virtualenv
명령을 드롭인 방식으로 대체합니다. - ⚡️
pip
및pip-tools
(pip-compile
및pip-sync
) 보다 10-100배 빠르다. - 💾 종속성 중복 제거를 위한 글로벌 캐시로 디스크 공간 효율을 높입니다.
- 🐍
Rust
나Python
없이curl
,pip
,pipx
등을 통해 바이너리로 설치할 수 있습니다. - 🧪 상위 10,000 개의 PyPI 패키지를 대상으로 대규모 테스트 완료.
- 🖥️ macOS, Linux, Windows 를 지원합니다.
- 🧰 고급 기능인 종속성 버전 재정의 및 대체 해결 전략 등을 포함.
- ⁉️ 현존하는 패키지 관리 중 가장 자세한 오류 메시지와 충돌 추적 해결사 제공.
- 🤝 편집 가능한 설치, Git 종속성, 직접 URL 종속성, 로컬 종속성, 제약 조건, 소스 배포, HTML 및 JSON 인덱스 등을 포함한 광범위한 기능 지원.
3 설치 방법
독립형 인스톨러로 uv
설치하기
# On macOS and Linux.
curl -LsSf https://astral.sh/uv/install.sh | sh
# On Windows.
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
# For a specific version.
curl -LsSf https://astral.sh/uv/0.2.29/install.sh | sh
powershell -c "irm https://astral.sh/uv/0.2.29/install.ps1 | iex"
# With pip.
pip install uv
# With pipx.
pipx install uv
# With Homebrew.
brew install uv
3.1 가상 환경 만들기
uv venv # `.venv`에 가상 환경을 만듭니다.
3.2 가상 환경 활성화
# On macOS and Linux.
source .venv/bin/activate
# On Windows.
.venv\Scripts\activate
3.3 가상 환경에 패키지 설치
uv pip install flask # Flask 설치.
uv pip install flask==2.0.0 # 특정 버전의 Flask 설치.
uv pip install -r requirements.txt # requirements.txt 파일을 통한 패키지 설치.
uv pip install -e . # 현재 프로젝트를 편집 가능한 모드로 설치.
uv pip install "package @ ." # 디스크에 저장된 패키지를 현재 프로젝트를 설치.
uv pip install "flask[dotenv]" # dotenv 의존성이 추가된 Flask를 설치.
의존성을 고정한 requirements.txt
파일을 생성합니다:
uv pip compile requirements.in -o requirements.txt # requirements.in 파일을 읽고 생성.
uv pip compile pyproject.toml -o requirements.txt # pyproject.toml 파일을 읽고 생성.
uv pip compile setup.py -o requirements.txt # setup.py 파일을 읽고 생성.
echo flask | uv pip compile - -o requirements.txt # stdin을 읽고 생성.
uv pip freeze | uv pip compile - -o requirements.txt # 현재 환경의 의존성을 고정.
고정한 의존성 파일을 가상 환경과 동기화합니다:
uv pip sync requirements.txt # requirements.txt 파일에서 설치합니다.
uv
의 pip-install
및 pip-compile
명령은 -r requirements.txt
, -c constraints.txt
, -e .
(편집 가능한 설치용), --index-url
등 기존 도구와 동일한 커맨드를 지원합니다.
4 마치며
또 새로운 파이썬 패키지 매니저가 나와서 더욱 혼란이 가중되는 것 같습니다. 그러나 uv
의 경이로운 속도를 겪어보니 생각이 또 바뀝니다. 파이썬 생태계가 더욱 일관되고 효율적으로 발전되길 바라면서 앞으로는 pip
는 사용하지 않고 uv
만을 써야겠습니다. uv
에 대하여 더 자세한 내용은 공식 repo 와 공식 문서 를 읽어보세요.