

Python 패키지 관리자라면 대표적인 pip의 자리를 uv가 위협하고 있다.
uv는 pip와 같은 패키지 관리자이지만 가상환경, 배포, 의존성 관리 모든 것을 할 수 있는 도구 모음집이다.
가장 중요한건 의존성 관리, 패키지 설치 시간이 pip과는 비교도 못할 정도로 빠르다.

간단하게 uv의 장점에 대해서 나열하자면
최근 여론에 따르면 속도만 보고도 uv로 넘어갈만한 정도라고 한다.
그래서 직접 uv 환경을 구축해서 패키지 다운로드가 얼마나 빠른지 체감해보았다.

요약하자면 의존성 해결 0.24초, 패키지 준비 27.05초, 패키지 설치 0.197초가 걸렸다.
저 많은 패키지들 게다가 빅데이터, AI 모델링 관련 패키지들을 30초도 안되는 시간에 설치를 완료했다.
난 솔직히 uv pip install 돌리고 놀라서 박수를 쳤다.
왜 빠를까?
필자는 wsl ubuntu-22.04 환경이기 때문에 Linux 기준으로 작성하겠다.
Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
pip을 이용해서 설치도 가능하지만 pip 대신 쓰는건데 pip으로 깔면 특정 환경에 종속되기 때문에 curl로 까는걸 추천한다.
환경 변수
# .zshrc or .bashrc
export PATH=$HOME/.local/bin:$PATH
export PATH=$PATH:/snap/bin
기존에 conda를 사용했다면 환경 변수에서 conda 파트를 주석하거나 지우는걸 추천한다.
자주 사용할 것 같은 기능만 정리하겠다.
# 버전은 원하는 버전으로 마음껏!, 여러 버전 한번에도 가능
uv python install 3.11 3.12 ..
# 설치된 파이썬 버전 확인
uv python list
# 폴더가 없다면 폴더명으로 폴더가 만들어진다!
# 원하는 파이썬 버전을 기준으로 초기화도 가능하다
uv init <원하는폴더명> <--python 버전>
# 기존에 폴더가 있다면 해당 폴더로 이동한 뒤
cd 원하는/프로젝트/폴더
uv init
프로젝트 초기화를 해도 .venv는 생성되지 않고 아래와 같은 파일들만 생성된다.
# .toml 파일이 이미 있다면 uv init이 안된다.
README.md __pycache__ main.py pyproject.toml
가상환경
# 원하는 곳으로 이동해 uv venv 한번이면 .venv 폴더가 생성된다.
cd 원하는/프로젝트/폴더
uv venv
가상환경 활성화
# 가상환경 실행
source .venv/bin/activate
# 굳이 활성화 안하고 스크립트 파일 실행이 가능하다.
uv run script.py # script.py 실행
uv run -m module # Python 모듈 실행
# 인자 전달
uv run script.py --arg1 value1 --arg2 value2 # 스크립트에 인자 전달
uv run -m pytest tests/ --verbose # pytest에 옵션 전달
# 환경 변수 설정
uv run --env VAR1=value1 --env VAR2=value2 script.py # 환경 변수 설정
# 가상 환경 종료
deactivate
패키지 설치
# 기본 패키지 설치
uv pip install requests # requests 패키지 설치
# 특정 버전 설치
uv pip install requests==2.31.0 # requests 2.31.0 버전 설치
uv pip install "requests>=2.31.0" # requests 2.31.0 이상 버전 설치
uv pip install "requests<3.0.0" # requests 3.0.0 미만 버전 설치
# 패키지 제거
uv pip uninstall requests # requests 패키지 제거
# 패키지 업그레이드
uv pip install --upgrade requests # requests 패키지 최신 버전으로 업그레이드
uv pip install --upgrade pip # pip 자체 업그레이드
uv pip list # 설치된 모든 패키지 목록 확인
의존성 관리
# add를 해야 해당 프로젝트의 의존성 리스트에 추가가 된다.
uv add requests # requests 패키지 추가
uv add requests==2.31.0 # 특정 버전의 requests 추가
# 의존성 제거
uv remove requests # requests 패키지 제거
# 의존성 관리 : add한 것들이 uv.lock에 들어간다.
uv lock # 현재 의존성 상태를 잠금 파일에 저장
uv pip freeze > requirements.txt # requirements.txt 관리
uv pip install -r requirements.txt
# 의존성 동기화 : uv.lock 기준으로 의존성을 맞춘다.
uv sync # 모든 의존성 설치/업데이트
# 프로젝트 초기화
uv init uvtest --python 3.11
cd uvtest
# 가상환경 생성 : 초기화 할때 설정한 파이썬 버전 기준으로 생성됨
uv venv
# 패키지 설치 + 의존성 추가
uv add \ # 삭제는 remove
pandas \
numpy \
scipy \
matplotlib \
seaborn \
scikit-learn \
xgboost \
lightgbm \
fastapi \
'uvicorn[standard]' \
pydantic \
sqlalchemy \
alembic \
psycopg2-binary \
pyspark \
great-expectations \
dbt-core \
requests \
beautifulsoup4
# 의존성 기록 : requirements.txt 느낌
uv lock
# uv.lock 기준 의존성 동기화
uv sync
기존에 사용하던 pip 명령어와 크게 다를건 없어 보인다.
그래서 러닝커브도 그렇게 크지 않은데 패키지 설치 속도는 10 ~ 100배 빠르고, uv 하나면 가상환경까지 전부 사용할 수 있다.
솔직히 속도만 봐도 넘어갈 정도인데 한방에 모든게 된다는 게 또 호감이다.