pip 대신에 uv 사용하기

Python
Package manager
Virtual environment
Data science
Tip
Author

Taeyoon Kim

Published

August 24, 2024

Modified

August 24, 2024

pip 는 파이썬 패키지 관리자로 유용하지만 아래와 같은 몇 가지 근본적인 문제가 있습니다. 특히 패키지 의존성과 환경 관리는 문제가 터지면 해결하기가 아주 어렵습니다.

1 pip이 가지는 문제

  1. 의존성 충돌 (Dependency Conflicts)

여러 패키지를 설치할 때 각 패키지가 서로 다른 버전의 동일한 종속성을 요구할 경우 의존성 충돌이 발생하며 프로젝트에서 예기치 않은 동작이나 오류를 발생시킬 수 있습니다.

  1. 글로벌 설치 문제

기본적으로 pip 는 전역 파이썬 환경에 패키지를 설치합니다. 이로 인해, 여러 프로젝트에서 동일한 패키지 버전을 공유하게 되어 프로젝트 간에 종속성 충돌이 발생할 수 있습니다. 특히, 프로젝트마다 요구되는 패키지 버전이 다른 경우에 문제가 됩니다.

  1. 환경 관리의 어려움

pip 는 파이썬 환경을 별도로 관리하지 않으므로 전역 환경에 설치된 패키지들이 서로 영향을 미칠 수 있습니다. 이로 인해, 동일한 시스템에서 여러 프로젝트를 작업할 때 각 프로젝트의 요구 사항을 일관되게 유지하기 어려워집니다. 이를 해결하기 위해 virtualenv 와 같은 도구를 사용해 가상 환경을 생성해야 합니다.

  1. 보안 문제

pip 는 기본적으로 모든 패키지를 신뢰합니다. 악의적인 사용자가 배포한 패키지가 PyPI 에 업로드되면, 이를 설치하는 과정에서 보안 문제가 발생할 수 있습니다.

  1. 복잡한 패키지 관리

복잡한 프로젝트에서는 수많은 패키지와 버전들을 관리해야 하는데, pip 는 기본적으로 이러한 복잡한 종속성 트리를 관리하는 데 최적화되어 있지 않습니다. 이는 특정 패키지 설치 시 종속성 문제가 발생할 때 수동으로 해결해야 하는 번거로움으로 이어질 수 있습니다. 이러한 문제들로 인해, 많은 개발자들이 pipenv 또는 poetry 같은 도구들을 사용하여 환경과 패키지 관리를 하고 있습니다.

2 uv 소개

uv(Unified Python packaging) 는 Rust 로 작성된 pip 워크플로우를 대체하는 매우 빠른 파이썬 패키지 설치 프로그램입니다. 캐싱 없이 pip 보다 8-10 배 빠르며, 캐시가 있을 때는 80-115 배 빠릅니다. 또한 전역 모듈 캐시를 사용하여 의존성을 다시 다운로드하거나 빌드하지 않고 디스크 공간 사용을 최소화합니다.

특징

  • ⚖️ 일반적인 pip, pip-tools, virtualenv 명령을 드롭인 방식으로 대체합니다.
  • ⚡️ pippip-tools(pip-compilepip-sync) 보다 10-100배 빠르다. 
  • 💾 종속성 중복 제거를 위한 글로벌 캐시로 디스크 공간 효율을 높입니다.
  • 🐍 RustPython 없이 curl, pip, pipx 등을 통해 바이너리로 설치할 수 있습니다.
  • 🧪 상위 10,000 개의 PyPI 패키지를 대상으로 대규모 테스트 완료.
  • 🖥️ macOS, Linux, Windows 를 지원합니다.
  • 🧰 고급 기능인 종속성 버전 재정의대체 해결 전략 등을 포함.
  • ⁉️ 현존하는 패키지 관리 중 가장 자세한 오류 메시지와 충돌 추적 해결사 제공.
  • 🤝 편집 가능한 설치, Git 종속성, 직접 URL 종속성, 로컬 종속성, 제약 조건, 소스 배포, HTML 및 JSON 인덱스 등을 포함한 광범위한 기능 지원.

uv 는 Ruff 의 제작자인 Astral 의 지원을 받습니다.

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 파일에서 설치합니다.

uvpip-installpip-compile 명령은 -r requirements.txt, -c constraints.txt, -e .(편집 가능한 설치용), --index-url 등 기존 도구와 동일한 커맨드를 지원합니다.

4 마치며

또 새로운 파이썬 패키지 매니저가 나와서 더욱 혼란이 가중되는 것 같습니다. 그러나 uv 의 경이로운 속도를 겪어보니 생각이 또 바뀝니다. 파이썬 생태계가 더욱 일관되고 효율적으로 발전되길 바라면서 앞으로는 pip 는 사용하지 않고 uv 만을 써야겠습니다. uv 에 대하여 더 자세한 내용은 공식 repo공식 문서 를 읽어보세요.