새로운 Python Package Manager

uv 의 목적

uv는 Rust로 작성된 고속 의존성 해석 엔진을 앞세워, 가상환경 생성, 의존성 관리, 파이썬 버전 관리, 패키징, 포매터/린터 같은 서드파티 도구 실행을 한번에 알잘딱 처리합니다.

  1. A single tool to replace pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv, and more.
  2. 10-100x faster than pip.
  3. Cargo-style workspaces
  4. Supports macOS, Linux, and Windows.
  5. 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/

  1. 초기 시절: easy_install
    2000년대 후반~2010년대 초반에는 PyPI와 pip 가 지금처럼 성숙하지 않았습니다.
    당시에는 easy_install 이 사실상 유일한 선택지였고, 설치한 패키지를 제거하거나, 설치된 패키지 버전을 지정·고정하는 기능이 부족해 많은 불편이 있었습니다.

  2. pip의 등장
    pip는 requirements.txt를 통해 의존성을 고정하고 설치할 수 있는 기능을 제공하면서, 그야말로 Python 커뮤니티의 표준이 되었습니다.
    Python 공식 배포판에도 점차 포함되어 사실상 “파이썬 하면 pip”라는 인식이 굳어지기도 했습니다.

  3. conda의 등장과 머신러닝 생태계
    conda는 주로 NumPy, SciPy 같은 과학 컴퓨팅 라이브러리를 쉽게 설치하고자 하는 목적에서 개발되었습니다.
    하지만 conda 는 별도의 패키지 저장소(Anaconda Cloud, conda-forge)를 사용하고, pip 와는 분리된 자체 의존성 해석 방식, 가상환경 관리 방식을 채택하고 있어서 생태계가 이원화되는 문제를 야기했습니다.
    그 결과, 리서쳐와 서비스 개발자 간의 소통 문제가 빈번히 발생해 왔습니다.

  4. poetry의 부상
    poetry는 pyproject.toml과 poetry.lock 기반으로 의존성을 엄격히 고정하고, 여러 플랫폼에서 재현 가능한 빌드를 제공한다는 점에서 각광을 받았습니다.

단점으로는, 복잡한 의존성을 가진 프로젝트에서 해석 속도가 느리다는 점이 종종 지적되었습니다.

그럼에도 Poetry는 “제대로 동작하는 것을 보장한다” 는 확실한 장점을 가진 덕분에, 비교적 규모가 큰 팀이나 오픈소스 프로젝트에서 널리 채택되었습니다.

  1. 기타 pyenv 등.
    pyenv, pipx, pipenv, pip-tools 등의 도구도 각자 가상환경·의존성 관리, Python 버전 관리, 종속성 락(lock) 파일 관리 등 다양한 문제를 해결하고자 시도했습니다.

하지만 이런 도구마다 관점이 달라서, 서로 비슷한 기능이 겹치거나, 설정 방식이 달라 숙련된 개발자조차 혼란스러워하는 지점이 많았습니다.

Installation

Install uv with our standalone installers:

1
2
# On macOS and Linux.
curl -LsSf https://astral.sh/uv/install.sh | sh
1
2
# On Windows.
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

from PyPI:

1
2
3
4
5
# With pip.
pip install uv

# Or pipx.
pipx install uv

설치후 self update

1
uv self update

Uninstall

1
2
3
4
# Remove all data that uv has stored
uv cache clean
rm -r "$(uv python dir)"
rm -r "$(uv tool dir)"
1
2
# Remove binaries
rm ~/.local/bin/uv ~/.local/bin/uvx

사용방법

  1. 가상환경을 만들고 이를 이용하는 방법
  2. 프로젝트 폴더별로 가상화경만 이용하는 방법
  3. 프로젝트에서 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 준비한다.

  1. 프로젝트 폴더에서 uv 프로젝트 초기화
  2. 의존성 requirements.txt 설치
1
2
mkdir my_uv_project
uv venv my_env -p 3.13

활성화

1
2
3
4
5
# window
./my_env/scripts/activate

# linux & macos
source ./my_env/bin/activate
1
2
3
4
5
FOLDER/
├── .python-version
├── .gitignore
├── pyproject.toml
└── README.md

가상환경에서 uv pip 명령으로 패키지를 설치하고 관리할 수 있다.

하지만 호환을 위해 pip 를 사용해야할 경우도 많기 때문에 pip 를 설치해 준다.

1
2
3
4
(my_env)> uv pip install pip
Resolved 1 package in 77ms
Prepared 1 package in 362ms
Installed 1 package in 589ms

폴더별 가상환경을 만들어 사용한다.

특정 디렉토리에서 pin 명령으로 python 버전을 지정할 수 있다.

  • 여기서 A, B 디렉토리를 만들고 3.10, 3.11를 지정해 사용해 보겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir A
mkdir B

cd A
uv venv -p 3.10
Using CPython 3.10.16
Creating virtual environment at: .venv
Activate with: .venv\Scripts\activate

PS D:\A> .\.venv\Scripts\activate
(A) PS D:\A>
(A) PS D:\A> deactivate
PS D:\A>

B 폴더에서 가상환경을 만든다

1
2
3
4
5
6
7
8
9
cd ../B
> uv venv -p 3.11
Using CPython 3.11.11
Creating virtual environment at: .venv
Activate with: .venv\Scripts\activate
PS D:\B> .\.venv\Scripts\activate
(B) PS D:\B>
(B) PS D:\B> deactivate
PS D:\B>

여러 가상환경을 만들어 사용

한 프로젝트 폴더에 여러개의 가상환경을 만들어 사용할 수 있다.

기존 가상환경에서 새로운 가상환경을 추가해 서로 교화하며 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 새 가상환경 생성
(A) PS D:\A> uv venv .second_env -p 3.12
Using CPython 3.12.9
Creating virtual environment at: .second_env
Activate with: .second_env\Scripts\activate

# second_env 활성화
(A) PS D:\A> .\.second_env\Scripts\activate
(.second_env) PS D:\A> python -V
Python 3.12.9

# .venv 활성화
(.second_env) PS D:\A> .\.venv\Scripts\activate
(A) PS D:\A> python -V
Python 3.10.16
(A) PS D:\A>```


# 프로젝트 의존성 이용하기

기존 프로젝트/폴더에서 사용하던 requirements.txt 준비한다.

1. 프로젝트 폴더에서 uv 프로젝트 초기화
3. 의존성 requirements.txt 설치
1. 의존성 추가하면 자동으로 .venv 가상환경이 생성된다.

진행한 후 폴더에 다음 파일이 추가된다

FOLDER/
├── .venv
├── .python-version
├── .gitignore
├── pyproject.toml
└── README.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20



1. 프로젝트 초기화

```powershell
# 프로젝트 폴더
> cd My-lectures

> uv init
Initialized project `My-lectures`


2. 의존성 설치

```powershell
> uv add -r .\requirements.txt
Resolved 156 packages in 880ms
Prepared 36 packages in 39.36s
Installed 36 packages in 39.04s
  1. 가상환경 활성화
1
2
> .\.venv\Scripts\activate
(My-lectures) PS D:\My_Lectures>
  1. IDE 에서 .venv 를 인식한다

동일한 .venv 가상 환경을 IDE가 바로 인식할 수 있다.

uv add –dev ipykernel # 개발용(인터랙티브) 의존성 추가

프로젝트 python 버전 변경

uv sync로 프로젝트에 필요한 Python 버전과 .venv 가 자동으로 맞춰진다.

앞의 My-lectures 폴더를 대상으로 변경해 보자.

  1. pyproject.toml 의 python 버전을 변경
  2. uv python pin 명령
  3. uv sync

의존성 python 버전을 변경하려면 pyproject.toml 를 수정해야 한다.

1
2
3
4
5
6
7
[project]
name = "jupyter-lectures"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = []

3.12로 변경해 보자

1
requires-python = ">=3.12"

pin 으로 버전을 변경한다

1
> uv python pin 3.12

uv sync 로 pyproject.toml 의 의존성을 .venv 에 업데이트 한다.

1
2
3
4
5
6
7
> uv sync
Using CPython 3.12.9
Removed virtual environment at: .venv
Creating virtual environment at: .venv
Resolved 171 packages in 764ms
Prepared 25 packages in 13.32s
Installed 166 packages in 28.90s

uv pip 사용

pip 는 uv 명령으로 사용하면 된다.

1
uv pip

Project 사용

https://docs.astral.sh/uv/guides/projects/

https://sigridjin.medium.com/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%9D%BC%EB%A9%B4-uv-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%A9%EC%8B%9C%EB%8B%A4-546d523f7178