새로운 Python Package Manager
uv 의 목적
uv는 Rust로 작성된 고속 의존성 해석 엔진을 앞세워, 가상환경 생성, 의존성 관리, 파이썬 버전 관리, 패키징, 포매터/린터 같은 서드파티 도구 실행을 한번에 알잘딱 처리합니다.
- A single tool to replace pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv, and more.
- 10-100x faster than pip.
- Cargo-style workspaces
- Supports macOS, Linux, and Windows.
- https://github.com/astral-sh/uv
Cargo-style workspaces
독립적인 공간의 의존성, 가상환경, 패키지 관리를 할 수 있다.
- pyenv, virtualenv 등의 가상환경 구성후 프로젝트에서 사용하는 방식이 아니다.
- 프로젝트 공간에 의존성, 가상환경 등을 직접 구성한다.
- venv 를 각 프로젝트 폴더에서 관리한다.
Python 패키징이 복잡해진 역사
https://www.reddit.com/r/Python/comments/cry1fn/rant_after_going_through_literal_hell_with/
초기 시절: easy_install
2000년대 후반~2010년대 초반에는 PyPI와 pip 가 지금처럼 성숙하지 않았습니다.
당시에는 easy_install 이 사실상 유일한 선택지였고, 설치한 패키지를 제거하거나, 설치된 패키지 버전을 지정·고정하는 기능이 부족해 많은 불편이 있었습니다.pip의 등장
pip는 requirements.txt를 통해 의존성을 고정하고 설치할 수 있는 기능을 제공하면서, 그야말로 Python 커뮤니티의 표준이 되었습니다.
Python 공식 배포판에도 점차 포함되어 사실상 “파이썬 하면 pip”라는 인식이 굳어지기도 했습니다.conda의 등장과 머신러닝 생태계
conda는 주로 NumPy, SciPy 같은 과학 컴퓨팅 라이브러리를 쉽게 설치하고자 하는 목적에서 개발되었습니다.
하지만 conda 는 별도의 패키지 저장소(Anaconda Cloud, conda-forge)를 사용하고, pip 와는 분리된 자체 의존성 해석 방식, 가상환경 관리 방식을 채택하고 있어서 생태계가 이원화되는 문제를 야기했습니다.
그 결과, 리서쳐와 서비스 개발자 간의 소통 문제가 빈번히 발생해 왔습니다.poetry의 부상
poetry는 pyproject.toml과 poetry.lock 기반으로 의존성을 엄격히 고정하고, 여러 플랫폼에서 재현 가능한 빌드를 제공한다는 점에서 각광을 받았습니다.
단점으로는, 복잡한 의존성을 가진 프로젝트에서 해석 속도가 느리다는 점이 종종 지적되었습니다.
그럼에도 Poetry는 “제대로 동작하는 것을 보장한다” 는 확실한 장점을 가진 덕분에, 비교적 규모가 큰 팀이나 오픈소스 프로젝트에서 널리 채택되었습니다.
- 기타 pyenv 등.
pyenv, pipx, pipenv, pip-tools 등의 도구도 각자 가상환경·의존성 관리, Python 버전 관리, 종속성 락(lock) 파일 관리 등 다양한 문제를 해결하고자 시도했습니다.
하지만 이런 도구마다 관점이 달라서, 서로 비슷한 기능이 겹치거나, 설정 방식이 달라 숙련된 개발자조차 혼란스러워하는 지점이 많았습니다.
Installation
Install uv with our standalone installers:
1 | # On macOS and Linux. |
1 | # On Windows. |
from PyPI:
1 | # With pip. |
설치후 self update
1 | uv self update |
Uninstall
1 | # Remove all data that uv has stored |
1 | # Remove binaries |
사용방법
- 가상환경을 만들고 이를 이용하는 방법
- 프로젝트 폴더별로 가상화경만 이용하는 방법
- 프로젝트에서 pyproject.toml 의존성을 이용하는 방법
Python version
uv 에서 standalone 으로 python 을 설치하고 변경할 수 있다.
원하는 폴더에서 .python-version 파일의 버전으로 파이썬을 실행할 수 있다.
standalone python 을 설치한다.
1 uv python install 3.10 3.11 3.12
가상환경 사용하기
https://docs.astral.sh/uv/pip/environments/
https://earthly.dev/blog/python-uv/
새로운 가상환경 만들기
기존 프로젝트/폴더에서 사용하던 requirements.txt 준비한다.
- 프로젝트 폴더에서 uv 프로젝트 초기화
- 의존성 requirements.txt 설치
1 | mkdir my_uv_project |
활성화
1 | # window |
1 | FOLDER/ |
가상환경에서 uv pip 명령으로 패키지를 설치하고 관리할 수 있다.
하지만 호환을 위해 pip 를 사용해야할 경우도 많기 때문에 pip 를 설치해 준다.
1 | (my_env)> uv pip install pip |
폴더별 가상환경을 만들어 사용한다.
특정 디렉토리에서 pin 명령으로 python 버전을 지정할 수 있다.
- 여기서 A, B 디렉토리를 만들고 3.10, 3.11를 지정해 사용해 보겠다.
1 | mkdir A |
B 폴더에서 가상환경을 만든다
1 | cd ../B |
여러 가상환경을 만들어 사용
한 프로젝트 폴더에 여러개의 가상환경을 만들어 사용할 수 있다.
기존 가상환경에서 새로운 가상환경을 추가해 서로 교화하며 사용할 수 있다.
1 | # 새 가상환경 생성 |
FOLDER/
├── .venv
├── .python-version
├── .gitignore
├── pyproject.toml
└── README.md
1 |
|
- 가상환경 활성화
1 | > .\.venv\Scripts\activate |
- IDE 에서 .venv 를 인식한다
동일한 .venv 가상 환경을 IDE가 바로 인식할 수 있다.
uv add –dev ipykernel # 개발용(인터랙티브) 의존성 추가
프로젝트 python 버전 변경
uv sync로 프로젝트에 필요한 Python 버전과 .venv 가 자동으로 맞춰진다.
앞의 My-lectures 폴더를 대상으로 변경해 보자.
- pyproject.toml 의 python 버전을 변경
- uv python pin 명령
- uv sync
의존성 python 버전을 변경하려면 pyproject.toml 를 수정해야 한다.
1 | [project] |
3.12로 변경해 보자
1 | requires-python = ">=3.12" |
pin 으로 버전을 변경한다
1 | > uv python pin 3.12 |
uv sync 로 pyproject.toml 의 의존성을 .venv 에 업데이트 한다.
1 | > uv sync |
uv pip 사용
pip 는 uv 명령으로 사용하면 된다.
1 | uv pip |
Project 사용
새로운 Python Package Manager
https://thinkbee.github.io/python-uv-package_manager-7b296c51b35d/