러스트로 작성된 매우 빠른 Python 패키지 및 프로젝트 관리자 uv
(github.com/astral-sh)- uv는 러스트(Rust) 기반의 매우 빠른 Python 패키지 및 프로젝트 관리 도구임
- pip, pip-tools, pipx, poetry, pyenv, virtualenv 등을 하나로 대체할 수 있음
- 최대 10~100배 빠른 성능과 디스크 공간 절약, 강력한 캐시 및 cross-platform 지원 제공
- 스크립트, 프로젝트, 도구, 다양한 Python 버전 관리 등 통합적인 개발 환경 지원 기능 포함
- 개발 생산성, 대규모 프로젝트, 빠른 작업 속도에 최적화된 현대적 Python 개발 워크플로우 실현 가능
오픈소스 소개 및 차별화 포인트
- uv는 기존의 pip, pip-tools, pipx, poetry, pyenv, virtualenv, twine 등 여러 Python 관리 도구 기능을 하나의 단일 툴로 통합함
- 러스트(Rust)로 개발하여 성능이 매우 우수하며, 전통적인 pip 대비 10~100배 빠른 설치 및 동기화 속도를 자랑함
- 글로벌 캐시 및 의존성 중복 제거로 디스크 활용 최적화 기능을 제공하며, 직관적 CLI와 친숙한 pip 호환성을 지원함
- macOS, Linux, Windows 등 다양한 플랫폼에서 독립 실행 파일로 설치 가능함
- 독립형 설치 방식, pip 및 pipx와 연동, 자체 자동 업데이트 지원 등 편의성 강화가 특징임
주요 특징(Highlights)
- 하나의 uv 도구로 pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv 등의 다양한 기능을 대체 가능
- 기존 pip 대비 10~100배 빠른 설치/업데이트/동기화 성능 제공
- lockfile 기반으로 프로젝트 의존성 관리 및 workspaces, universal lockfile 지원
- 스크립트 의존성 인라인 선언 및 자동 환경 분리 실행 기능
- 다양한 Python 버전 관리/설치/변경 지원
- Python 패키지로 배포된 도구 실행 및 설치 지원 (pipx 대체)
- pip 인터페이스 호환 및 추가 기능 제공 (버전 덮어쓰기, 플랫폼 독립적 해결 등)
- Cargo 스타일 workspace로 대규모 프로젝트에 최적화
- 글로벌 캐시로 의존성 중복 최소화 및 디스크 공간 효율화
- Rust/Python 환경 없이도 curl 또는 pip, pipx로 설치 및 사용 가능
- macOS, Linux, Windows 등 멀티 플랫폼 지원
- Astral 및 Ruff를 개발한 팀에서 제작
프로젝트 관리(Project Management)
- 프로젝트 단위로 의존성, 환경, 잠금(lock) 파일, workspace 등을 완벽 지원
- 'uv init' 명령으로 프로젝트 자동 초기화 및 virtualenv 생성
- 'uv add'로 의존성 추가, 'uv lock' 및 'uv sync' 명령으로 패키지 동기화 및 보안 감사를 자동 처리
- Poetry, Rye 등 현대적인 Python 프로젝트 관리 도구의 기능을 대체하면서 더 빠른 처리 성능 보장
- uv로 관리하지 않은 프로젝트 빌드 및 배포(publish)도 지원
스크립트 관리(Scripts)
- 단일 파일 스크립트에 의존성 inline 메타데이터 선언 가능
- script 실행시 자동 가상환경 분리 및 의존성 설치 지원
-
uv add --script
로 스크립트별로 의존성 관리,uv run
명령으로 환경 격리 실행 - 데이터 과학/자동화와 같은 단발성 스크립트 활용에 최적화
도구 관리(Tools)
- Python 패키지 형식의 CLI 도구를 pipx처럼 설치 및 실행 가능
-
uv tool install
,uvx
명령으로 임시 환경 혹은 전역 실행 활용 - 설치된 도구 확인 및 버전 관리, 업데이트 지원
Python 버전 관리
- 여러 Python 버전을 간편하게 설치 및 즉시 전환 가능
- 다양한 버전을 병렬로 관리하고, 프로젝트별
.python-version
핀 설정 가능 - pypy 등 대체 구현체도 동일 인터페이스 지원
-
uv python install/pin
등 명령으로 버전 설치, 지정, 활성화
pip 인터페이스(Pip Interface)
-
uv pip
,uv venv
로 기존 pip, pip-tools, virtualenv를 완벽히 대체 - 의존성 버전 override, 플랫폼 독립 해상, 재현 가능한 빌드 등 고급 기능 포함
- 기존 워크플로우 변경 없이 pip drop-in 대체하며 10~100배 성능 향상 제공
- requirements.in → requirements.txt 변환, 가상환경 생성 및 requirements 동기화 지원
플랫폼 및 버전 정책
- 다양한 운영체제(Windows, macOS, Linux) 지원
- 정책 및 지원 플랫폼 정보는 공식 문서 참조 가능
기여(Contributing)
- 초심자부터 전문가까지 다양한 기여자 지원을 목표로 하며, 관련 가이드 제공
FAQ
- uv 발음은 “유-브이”로 표기함
- 스타일은 소문자 “uv”로 고정
기술적 배경 및 감사(Acknowledgements)
- 의존성 해결 알고리듬은 PubGrub을 사용
- Git 구현은 Cargo 기반
- 최적화 전략은 pnpm, Orogene, Bun, Posy 등 최신 패키징 도구에서 많은 영감을 받음
라이선스
- MIT 및 Apache-2.0 중 택일하여 사용할 수 있음
- 기여한 코드 역시 동일 조건으로 이중 라이선스됨
Hacker News 의견
-
몇 달 전까지만 해도 uv를 절대 쓰지 않겠다고 생각했는데, 이미 venv와 pip에 익숙했기 때문이었음, 다른 도구가 굳이 필요하다고 생각하지 않았음, 하지만 최근 공유 서버에서 root 권한이 없는 상황에서 각종 패키지나 드라이버가 다 깨져 있었고 pytorch가 필요했던 경험 덕분에 완전히 uv로 바꾼 상황, pip은 오랜 시간이 걸리고 캐시가 공간을 엄청 차지하며 위치 변경도 잘 안 되는 불편함이 있었음, uv로 바꾸자 모든 게 너무 잘 동작해서 만족함, 아직 망설이고 있다면 5분만이라도 꼭 써보라는 추천
- uv의 최고의 장점은 기존에 쓰던 venv 기반 워크플로우와 완전히 호환된다는 점, 그냥
uv venv
실행으로 해결 가능 - uv는 설명하거나 특히 초보자에게 사용법을 안내할 때 훨씬 쉽게 느껴짐, pip + 설정 파일 + venv 조합은 올바른 venv를 만들고 설치하는 과정이나, 스크립트 실행/테스트마다 어색한 shebang이나 venv 활성화를 기억해야 해서 헷갈리고 에러 메시지도 온전히 도움을 못 주는 불편함이 있었음, 초보자에게 가르칠 때 도구들이 참 번거롭게 느껴졌고, 이제는 "uv run", "uv add", "uv sync"만 기억하면 되니까 팀원들도 훨씬 덜 부담스럽게 받아들이는 분위기
- 나의 경우 asdf를 사용하다가 mise로 넘어갔는데, uv와 같은 범용 도구들과 비교하면 어떨지 궁금증
- pip 캐시가 많은 공간을 차지하고 위치도 제대로 바꿀 수 없었다고 했는데, uv가 저장소 공간 활용 면에서 더 나은지 궁금, 만약 낫다면 그 이유가 공유를 잘하는 방식 때문인지도 궁금함
- 최근 실험용 저장소에서 "uv a b c"로 시작하는 간단한 가이드 보고 실행해본 경험, 내부적으로 많은 중복이 있는 듯하지만, 실사용에서는 GNU-Debian-Ubuntu 기본 호스트에서 딱히 문제 없고 모든 게 순조롭게 돌아가서 만족
- uv의 최고의 장점은 기존에 쓰던 venv 기반 워크플로우와 완전히 호환된다는 점, 그냥
-
처음 uv를 썼을 때, pip과 비교해 워낙 빨리 끝나서 뭔가 실수했거나 제대로 동작하지 않은 줄 알았던 기억
- 가끔 패키지 설치에 200ms 정도 걸려서 엔터 입력과 프롬프트 표시 사이에 아주 약간의 딜레이가 느껴짐, 하지만 Poetry에서는 커피 한 잔 마시고 오면 끝나는 수준이라 속도 차이가 확연함
- 나 역시 같은 느낌, 워낙 매끄러워서 Python이 아닐 것 같은 경험
- 비슷한 경험을 최근에 했고, 덕분에 완전히 uv로 전향한 입장
- 나도 의심이 들 정도였지만, 시도해보고 나선 원래로 돌아갈 수 없을 정도로 만족
-
uv와 ruff는 "절대 바퀴를 다시 만들지 말라"는 말에 대한 멋진 반례라고 생각, 목적이 뚜렷하다면 기존보다 월등히 나은 결과물이 나오는 경우도 발생
- 대부분 그런 말이 나오는 맥락은 기존을 잘 모르는 초보자에게 해당하는 조언이라고 봄, 즉 시스템의 한계와 개선점을 모르는 사람이 섣불리 재발명을 시도할 때에만 들어맞음, 진짜 전문가에겐 해당 안 되는 말
- 이들이 바퀴를 다시 만든 게 아니라, 기존의 목재 바퀴를 더 견고한 재질로 교체해서 10배 속도로 회전 가능하게 만들었다는 비유
- Python 패키지 관리의 역사만 봐도 모두가 기존보다 더 잘 만들겠다는 생각으로 뛰어든다는 인상
- 사실 "바퀴를 다시 만들지 않는다"는 속담 자체가 말이 안 됨, 우리는 실제 바퀴도 계속 발전시켜 왔는데 소프트웨어 역시 더 좋은 바퀴를 만들지 않을 이유가 없음
- 약간 새는 이야기지만, "order of magnitude better" 대신 왜 짧은 "10x" 표현을 안 쓰고 굳이 긴 표현을 선호하는지 궁금증
-
작은/저사양 시스템(AWS T2.micro에서 Windows 같이)에선 uv가 너무 많은 동시 다운로드를 시도해 타임아웃이 남, 환경 변수 UV_CONCURRENT_DOWNLOADS로 동시 다운로드 수를 1~2 정도로 제한하면 해결, uv 기본 설정이 너무 공격적이라 느끼며, 서버별 스레드 자동 조정에 다운로드 속도를 활용하는 식으로 개선되면 좋겠음
- 전혀 이상한 사례가 아니며, 많은 유저가 저렴한 VPS에서 사이드 프로젝트를 진행함, (본인도 자주 그러는 편, AWS는 아니지만), 공유해줘서 고맙고 자동 감지 기능이 개선되길 바람
-
최근 노트북에 uv를 개인용으로 써보고 있는데, pip에 익숙했던 입장에선 체감 속도가 도무지 믿기 힘들 정도로 빨라서 몇 번은 제대로 실행됐는지 헷갈린 경험
-
uv add <mydependencies> --script mycoolscript.py 명령을 좋아함, 그리고 맨 위에 #!/usr/bin/env -S uv run을 붙이면 Python 스크립트를 즉시 실행 가능해서 매우 유용한 툴로 활용 중
- 이 방식을 Claude Project에 특화된 프롬프트로 가르쳐서, 단일 입력만으로 의존성 포함 전체 스크립트 자동 생성도 가능, Claude 4의 컷오프는 2025년 3월임, Claude Sonnet 4에선 추가 프롬프트 없이도 이 기능이 동작, 예시로 URL을 입력하면 httpx와 beautifulsoup으로 크롤링해서 링크 목록을 CSV로 반환하는 코드를 바로 생성 관련 자료 Claude 스크립트 결과
- Marimo.io 노트북의 app-mode와 함께 이 트릭을 사용, uv만 설치돼 있으면 즉석에서 반응형, 재현 가능한 앱을 최소한의 준비만으로 타인에게 손쉽게 전달 가능, 정말 최고 조합
- 지금은 작은 스크립트도 즉흥적으로 바로 실행하는 습관이 생겼음, 환경이나 의존성 관리를 신경 쓸 필요가 없어져서 훨씬 쾌적, the little scripter 관련 글, 관련 유튜브 영상, ez-mcp 깃허브
- 예시를 잘못 읽었다는 정정과, 프로젝트 컨텍스트에서 'uv add --script'와 단순 'uv add'는 다르단 설명 및, 공식 문서에서 run --with이나 PEP723 지원 등 더 유용한 기능이 많으니 확인 권장 공식 가이드
- "mydependencies"가 구체적으로 뭐냐는 질문, 설정 파일의 의미인지 궁금
-
uv를 예전에 시도했는데, 압도적으로 빠르고 사용도 쉬워서 놀람, 이제 거의 pip을 쓸 이유가 없고 Python만 쓴다면 conda도 필요가 없어짐
- pyenv와 poetry 역시 이제는 사용하지 않게 됨
-
UV를 정말 좋아함, Astral 팀의 Ruff도 좋아해서 기존 pylint + Black에서 Ruff로 린팅/포매팅을 모두 옮김, 린트 시간이 90초에서 1.5초 미만으로 단축된 경험, 깜짝 놀람
- 다만 ruff는 pylint의 일부 체크만 수행하고 지나치게 명확한 에러들도 검출 못하고 그냥 넘어간다는 점을 나중에 알게 돼서 아쉬움, (실행 불가한 코드 등도 걸러지지 않음)
-
최근에는 아래 패턴으로 작은 실행형 스크립트를 돌리는 게 새롭게 마음에 들어서 즐겨 사용 중
#!/usr/bin/env -S uv --quiet run --script # /// script # requires-python = ">=3.13" # dependencies = [ # "python-dateutil", # ] # /// # # [python script that needs dateutil]
- 해시뱅 줄이 너무 외우기 어려워서 그냥
#!/usr/bin/env uvx
정도의 더 단순한 형태가 있으면 좋겠음, 쓸 때마다 검색해야 하는 번거로움이 있음
- 해시뱅 줄이 너무 외우기 어려워서 그냥
-
완전히 만족해서 pip/twine/requirements.txt로 다시 돌아가고 싶지 않음, 여러 프로젝트가 내부 GitLab에 공용 휠을 두고 있었는데 기존 YAML 10줄을 "uv build"와 "uv publish" 두 줄로 대체 가능, 의존성 가져오기 편하고 주요 의존성도 한 번에 확인 가능, requirements.txt에 모든 걸 뒤섞어 두는 번거로움이 사라짐