๐ป ๋ด๊ฐ ๋ณด๋ ค๊ณ ์์ฑํ UV ์๋ฒฝ ๊ฐ์ด๋
์๋ณธ ๊ฒ์๊ธ: https://velog.io/@euisuk-chung/UV-๋ด๊ฐ-์ฐธ๊ณ ํ๋ ค๊ณ -์์ฑํ-UV-๊ฐ์ด๋
UV๋ Rust๋ก ๊ตฌํ๋ ์ด๊ณ ์ Python ํ๊ฒฝ ๊ด๋ฆฌ ๋๊ตฌ๋ก, Python ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ฐ์ฅ ๋น ๋ฅด๊ณ ๊ฐ๋จํ๋ฉฐ ๊ฐ๋ ฅํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๊ธฐ์กด์ ์ฌ๋ฌ ๋๊ตฌ๋ค(pyenv
, pip
, pipenv
, venv
๋ฑ)์ ํ๋๋ก ํตํฉํ์ต๋๋ค.
(๊นํ๋ธ) https://github.com/astral-sh/uv/blob/main/README.md
์ด ๊ฐ์ด๋์์๋ UV์ ํต์ฌ ๊ธฐ๋ฅ
๊ณผ ์ค๋ฌด ์ ์ฉ ๋ฐฉ๋ฒ
์ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
-
UV์ ๊ฐ๋ ๊ณผ ํน์ง
UV๋ ๋ฌด์์ธ๊ฐ?
UV๋ Astral์์ ๊ฐ๋ฐํ Rust ๊ธฐ๋ฐ์ Python ํ๊ฒฝ ๊ด๋ฆฌ ๋๊ตฌ
๋ก, Python ์ํ๊ณ์์ ์ฌ์ฉ๋๋ ๋ค์ํ ๋๊ตฌ๋ค์ ํ๋์ ํตํฉ๋ CLI๋ก ์ ๊ณตํฉ๋๋ค.
- ๊ธฐ์กด์ ์ฌ์ฉํ๋
pip
,pip-tools
,pipx
,poetry
,pyenv
,twine
,virtualenv
๋ฑ์ ๋์ฒดํ ์ ์์ต๋๋ค.
ํต์ฌ ํน์ง
- ์ด๊ณ ์ ์ฑ๋ฅ: Rust ์ธ์ด๋ก ์์ฑ๋์ด ๊ธฐ์กด ๋๊ตฌ๋ณด๋ค 10~100๋ฐฐ ๋น ๋ฅธ ์๋ ์ ๊ณต
- ํตํฉ๋ ์ํฌํ๋ก์ฐ: Python ๋ฒ์ ๊ด๋ฆฌ๋ถํฐ ํจํค์ง ์ค์น, ๊ฐ์ํ๊ฒฝ ์์ฑ, ํ๋ก์ ํธ ๋ฐฐํฌ๊น์ง ์ผ๊ด๋ ์ธํฐํ์ด์ค ์ ๊ณต
- ๋์คํฌ ๊ณต๊ฐ ์ต์ ํ: ํ๋ ๋งํฌ๋ฅผ ํ์ฉํด ์ค๋ณต ํจํค์ง ์ค์น ๋ฐฉ์ง
- ์ฌํ ๊ฐ๋ฅํ ๋น๋: ์ ํํ ์์กด์ฑ ์ ๊ธ๊ณผ ํด๊ฒฐ ๋ฉ์ปค๋์ฆ
- ๋ชจ๋ํ ํจํค์ง ๊ด๋ฆฌ:
pyproject.toml
์ ํ์ค์ผ๋ก ์ฌ์ฉํ์ฌ PEP 621 ์ค์
-
UV ์ค์น ๋ฐฉ๋ฒ
https://docs.astral.sh/uv/getting-started/installation/#standalone-installer
์ด์์ฒด์ ๋ณ ์ค์น ๊ฐ์ด๋
Windows
1
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
macOS/Linux
1
curl -LsSf https://astral.sh/uv/install.sh | sh
PyPI๋ฅผ ํตํ ์ค์น
1
pip install uv
์ค์น ํ์ธ
1
uv --version
๐ก ์ฐธ๊ณ : UV๋ฅผ ์ ์ญ์ผ๋ก ์ค์นํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
pip install uv
๋ก ์ค์นํ ๊ฒฝ์ฐ ํน์ ํ๊ฒฝ์ ์ข ์๋๊ธฐ ๋๋ฌธ์, ์์ ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ค์น ๋ฐฉ๋ฒ์ด ๋ ํจ๊ณผ์ ์ ๋๋ค.
-
UV ํต์ฌ ๊ธฐ๋ฅ ์์ธ ๊ฐ์ด๋
Python ์ค์นํ๊ธฐ
์ต์ ํ์ด์ฌ ์ค์นํ๊ธฐ:
1
uv python install
ํน์ ๋ฒ์ ํ์ด์ฌ ์ค์นํ๊ธฐ:
1
uv python install 3.12
(๋ณต์๊ฐ) ํน์ ๋ฒ์ ํ์ด์ฌ ์ค์นํ๊ธฐ:
1
uv python install 3.11 3.12
์ค์น ์ ์๋ฌ, ๋๋ ๋ค์ ์ค์น๊ฐ ํ์ํ ๊ฒฝ์ฐ
1 uv python install --reinstall
Python ๋ฒ์ ๊ด๋ฆฌ
UV๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด pyenv์ ์ ์ฌํ๊ฒ ๋ค์ํ Python ๋ฒ์ ์ ์ค์นํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๋ช ๋ น์ด | ์ค๋ช |
---|---|
uv python install <๋ฒ์ > |
์ง์ ํ Python ๋ฒ์ ์ค์น (uv python install 3.12 ) |
uv python list |
์ค์น ๊ฐ๋ฅํ Python ๋ฒ์ ๋ชฉ๋ก ํ์ (uv python list ) |
uv use <๋ฒ์ > |
ํ์ฌ ๋๋ ํ ๋ฆฌ์ .python-version ํ์ผ ์์ฑํ์ฌ ๊ธฐ๋ณธ Python ๋ฒ์ ์ง์ (uv use 3.11 ) |
๐ก ๊ณ ๊ธ ๊ธฐ๋ฅ:
uv python install --with-patches <ํจ์น๋ช > <๋ฒ์ >
๊ณผ ๊ฐ์ด ํน์ ํจ์น๊ฐ ์ ์ฉ๋ Python ๋ฒ์ ์ ์ค์นํ ์๋ ์์ต๋๋ค.
Python ์ค์น ์, UV๋ python-build-standalone
ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์ต์ํ์ ๊ตฌ์ฑ์์๋ง ๋ค์ด๋ก๋ํฉ๋๋ค.
- ์ด๋ ๋น ๋ฅธ ์ค์น๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ง๋ง, IDLE์ด๋ ๊ธฐํ ํ์ค ๋๊ตฌ๊ฐ ํฌํจ๋์ง ์์ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ ์ด๊ธฐํ ๋ฐ ๊ตฌ์ฑ
UV๋ ํ๋ก์ ํธ ์ด๊ธฐํ๋ฅผ ์ํ ๊ฐ๋จํ ๋ช ๋ น์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ช ๋ น์ด | ์ค๋ช | ์์ฑ๋๋ ํ์ผ/๋๋ ํ ๋ฆฌ |
---|---|---|
uv init |
๊ธฐ๋ณธ ํ๋ก์ ํธ ์ด๊ธฐํ | pyproject.toml , .python-version |
uv init --package |
ํจํค์ง ํํ ํ๋ก์ ํธ ์์ฑ | pyproject.toml , .python-version , src/ ๋๋ ํ ๋ฆฌ |
uv init --lib |
๋ฐฐํฌ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ก์ ํธ ์์ฑ | ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์กฐ์ pyproject.toml , ํ
์คํธ ๋๋ ํ ๋ฆฌ ๋ฑ |
๐ผ pyproject.toml
์์:
1
2
3
4
5
6
7
8
9
10
[project]
name = "my-project"
version = "0.1.0"
description = "A sample Python project"
requires-python = ">=3.8"
dependencies = []
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
๐ก ์ฐธ๊ณ :
uv init
๋ช ๋ น์ด๋.venv
๊ฐ์ํ๊ฒฝ์ ์ฆ์ ์์ฑํ์ง ์์ต๋๋ค.
- ํ์ง๋ง ์ดํ
uv add
,uv run
,uv sync
๋ฑ์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ๊ด๋ฆฌ
UV๋ ๊ฐ์ํ๊ฒฝ์ ํจ์จ์ ์ผ๋ก ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ช ๋ น์ด | ์ค๋ช | ์ฌ์ฉ ์ํฉ |
---|---|---|
uv venv [๊ฒฝ๋ก] |
(ํ๋ก์ ํธ์ ๋ณ๊ฐ๋ก ๋น ๋ฅด๊ฒ ๊ฐ์ํ๊ฒฝ ํ์ ์) ๊ฐ์ํ๊ฒฝ ์์ฑ | ย |
uv venv -p 3.11 [๊ฒฝ๋ก] |
(์์คํ Python๊ณผ ๋ค๋ฅธ ๋ฒ์ ์ผ๋ก ์์ ํ์ ์) ํน์ Python ๋ฒ์ ์ผ๋ก ๊ฐ์ํ๊ฒฝ ์์ฑ | ย |
uv sync |
(ํ๋ก์ ํธ ํด๋ก ํ ํ๊ฒฝ ์ฌํ ์) pyproject.toml ๊ณผ uv.lock ๊ธฐ๋ฐ์ผ๋ก .venv ๋๊ธฐํ |
ย |
๐ผ venv
์์:
1
2
3
4
5
# ํน์ Python ๋ฒ์ ์ผ๋ก ๊ฐ์ํ๊ฒฝ ์์ฑ
uv venv -p 3.10 .venv-310
# ํ์ฌ ํ๋ก์ ํธ ์ค์ ์ผ๋ก ๊ฐ์ํ๊ฒฝ ๋๊ธฐํ
uv sync
ํ์ฌ ํ๋ก์ ํธ ์ค์ ์ผ๋ก ๊ฐ์ํ๊ฒฝ ๋๊ธฐํ๋?
uv sync
๋ช ๋ น์ด์ ์๋ฏธ๋ ๋จ์ํ โํ์ฌ ๊ฒฝ๋ก์ .venv์ ๋๊ธฐํํ๋คโ๋ ์๋ฏธ๊ฐ ์๋๋ผ, ํ์ฌ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์ ์กด์ฌํ๋pyproject.toml
๋ฐuv.lock
ํ์ผ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ํ๊ฒฝ์ ๊ตฌ์ฑ(์ฌํ)ํ๋ค๋ ์๋ฏธ์ ๋๋ค.-
์ฆ, ์ด๋ฐ ํ๋ฆ์ด ๋ฉ๋๋ค:
uv init
ํน์ ์๋์ผ๋กpyproject.toml
์์ฑ- ์์กด์ฑ ์ถ๊ฐ โ
uv add ...
- uv lock ์คํ โ
uv.lock
์์ฑ๋จ - ์ดํ์:
-
.venv๊ฐ ์กด์ฌํ์ง ์๊ฑฐ๋
or์๋ก์ด ํ๊ฒฝ์ ๋ง๋ค์์ ๊ฒฝ์ฐ
โ
uv sync
๋pyproject.toml
๊ณผuv.lock
์ ๊ธฐ์ค์ผ๋ก ํ์ํ ํจํค์ง๋ฅผ.venv
(ํน์ ๋ค๋ฅธ ์ง์ ๋ ๊ฐ์ํ๊ฒฝ) ์ ์ค์นํ์ฌ ํ๊ฒฝ์ ์ผ๊ด์ฑ ์๊ฒ ์ฌํํ๋ ์์ ์ ์ํํฉ๋๋ค.
-
๐ก ์ฑ๋ฅ ์ด์ : UV๋ก ์์ฑํ ๊ฐ์ํ๊ฒฝ์ ํ์ค
venv
๋ชจ๋๋ก ์์ฑํ ๊ฒ๊ณผ ํธํ๋์ง๋ง, ์์ฑ ์๋๊ฐ ํจ์ฌ ๋น ๋ฆ ๋๋ค.
์ฐธ๊ณ : UV venv์ UV init์ ์ฐจ์ด์
uv venv
์ uv init
์ ๋ชฉ์ ๊ณผ ์ฌ์ฉ ์๋๋ฆฌ์ค๊ฐ ๋ค๋ฆ
๋๋ค:
uv venv
- ๋ชฉ์ : ์์ํ๊ฒ ๊ฐ์ํ๊ฒฝ๋ง ์์ฑ
- ๊ฒฐ๊ณผ๋ฌผ: Python ์ธํฐํ๋ฆฌํฐ์ ๊ธฐ๋ณธ ํจํค์ง๋ฅผ ํฌํจํ ๊ฐ์ํ๊ฒฝ(
.venv
๋๋ ํ ๋ฆฌ) - ์ฌ์ฉ ์๊ธฐ: ๋น ๋ฅด๊ฒ ๊ฒฉ๋ฆฌ๋ Python ํ๊ฒฝ์ด ํ์ํ ๋, ํ๋ก์ ํธ ์ค์ ์์ด ๋จ์ ์คํํ ๋
- ํน์ง: ํ๋ก์ ํธ ํ์ผ(
pyproject.toml
) ์์ฑํ์ง ์์
uv init
- ๋ชฉ์ : ํ๋ก์ ํธ ์ด๊ธฐํ ๋ฐ ๊ตฌ์กฐ ์ค์
- ๊ฒฐ๊ณผ๋ฌผ:
pyproject.toml
,.python-version
๋ฐ ๊ธฐํ ํ๋ก์ ํธ ํ์ผ - ์ฌ์ฉ ์๊ธฐ: ์ Python ํ๋ก์ ํธ๋ฅผ ์์ํ ๋, ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ํ์ํ ์ฒด๊ณ์ ์ธ ๊ฐ๋ฐ ์
- ํน์ง: ์ฆ์ ๊ฐ์ํ๊ฒฝ์ ์์ฑํ์ง ์์ง๋ง, ์ถํ ๋ช
๋ น์ด(
uv sync
,uv add
๋ฑ) ์คํ ์ ์๋์ผ๋ก ์์ฑ
์ฐธ๊ณ : ๊ฐ์ํ๊ฒฝ ํ์ฑํ ๋ฐฉ๋ฒ
UV์ ํฐ ์ฅ์ ์ค ํ๋๋ ์ ํต์ ์ธ ๊ฐ์ํ๊ฒฝ ํ์ฑํ(activate) ๊ณผ์ ์ด ํ์ ์๋ค๋ ์ ์ ๋๋ค.
- ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค:
1. UV ๋ช ๋ น์ด๋ก ์ง์ ์คํ (ํ์ฑํ ๋ถํ์)
1
2
3
uv run python script.py
uv add requests
uv run -- python -c "import sys; print(sys.prefix)"
2. ์ ํต์ ์ธ ๊ฐ์ํ๊ฒฝ ํ์ฑํ ๋ฐฉ๋ฒ
Windows
1
2
.\.venv\Scripts\Activate.ps1
.\.venv\Scripts\activate.bat
macOS/Linux
1
source .venv/bin/activate
3. ๊ฐ์ํ๊ฒฝ Python ์ง์ ์ฐธ์กฐ
Windows
1
.\.venv\Scripts\python script.py
macOS/Linux
1
./.venv/bin/python script.py
์์กด์ฑ ๊ด๋ฆฌ
UV๋ ์์กด์ฑ ์ถ๊ฐ
, ์ ๊ฑฐ
, ์
๋ฐ์ดํธ
๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
๋ช ๋ น์ด | ์ค๋ช | ์์ |
---|---|---|
uv add <ํจํค์ง> |
์์กด์ฑ ์ถ๊ฐ | uv add requests |
uv add --dev <ํจํค์ง> |
๊ฐ๋ฐ์ฉ ์์กด์ฑ ์ถ๊ฐ | uv add --dev pytest black |
uv remove <ํจํค์ง> |
์์กด์ฑ ์ ๊ฑฐ | uv remove requests |
uv lock |
๋ฝํ์ผ ์์ฑ/๊ฐฑ์ | uv lock |
๐ผ ์์กด์ฑ ๋ฒ์ ์ง์ ์์:
1
2
3
4
5
# ํน์ ๋ฒ์ ์ค์น
uv add "requests==2.31.0"
# ๋ฒ์ ๋ฒ์ ์ค์น
uv add "numpy>=1.24.0,<2.0.0"
๐ก ํ๋ ๋งํฌ์ ์ด์ : UV๋ ํจํค์ง ์ค์น ์ ํ๋ ๋งํฌ๋ฅผ ํ์ฉํ์ฌ ๋์ผํ ํจํค์ง๊ฐ ์ฌ๋ฌ ํ๊ฒฝ์ ์ค์น๋๋๋ผ๋ ๋์คํฌ ๊ณต๊ฐ์ ์ ์ฝํฉ๋๋ค.
- ํ๋ ๋งํฌ(Hard link)๋ ๋์ผํ ํ์ผ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์์น์์ ๊ณต์ ํ๋๋ก ํ๋ ํ์ผ ์์คํ ๊ธฐ๋ฅ์ ๋๋ค.
- UV๋ ์ด๋ฏธ ์ค์น๋ ํจํค์ง์ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ณต์ฌํ์ง ์๊ณ , ๋ค๋ฅธ ๊ฐ์ํ๊ฒฝ์์ ํด๋น ํ์ผ์ ๋ํ ํ๋ ๋งํฌ๋ง ์์ฑํ์ฌ ์ฐ๊ฒฐํฉ๋๋ค.
- ์ด ๋ฐฉ์์ ์ฌ๋ฌ ๊ฐ์ํ๊ฒฝ์ด ๋์ผํ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋์คํฌ ๊ณต๊ฐ์ ์ถ๊ฐ๋ก ์๋ชจํ์ง ์์ผ๋ฉฐ, ์ค์น ์๋๋ ๋น์ฝ์ ์ผ๋ก ํฅ์๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด numpy์ ๊ฐ์ ๋ํ ํจํค์ง๋ฅผ ์ฌ๋ฌ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋๋ผ๋ ์ค์ ๋์คํฌ์๋ ํ๋๋ง ์กด์ฌํ๋ฉฐ, ๊ฐ .venv๋ ํด๋น ํ์ผ์ ๋ํ ์ฐธ์กฐ๋ง ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
์คํ ๋ฐ ์คํฌ๋ฆฝํธ ๊ด๋ฆฌ
UV๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ํ๊ฒฝ ๋ด์์ ๋ช
๋ น์ด์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ
ํ ์ ์์ต๋๋ค.
๋ช ๋ น์ด | ์ค๋ช | ์์ |
---|---|---|
uv run <๋ช
๋ น์ด> |
๊ฐ์ํ๊ฒฝ์์ ๋ช ๋ น์ด ์คํ | uv run python script.py |
uv run --with <ํจํค์ง> <๋ช
๋ น์ด> |
์ถ๊ฐ ํจํค์ง์ ํจ๊ป ์คํ | uv run --with rich script.py |
uv pip freeze |
์ค์น๋ ํจํค์ง ๋ชฉ๋ก ์ถ๋ ฅ | uv pip freeze > requirements.txt |
๐ผ ์์ - ์์ฃผ ์ฌ์ฉํ๋ ๋ช ๋ น์ด:
1
2
3
4
5
# Jupyter Lab ์คํ
uv run jupyter lab
# ํ
์คํธ ์คํ
uv run pytest
๐ก ์๋ ๊ฐ์ํ๊ฒฝ ์์ฑ:
.venv
๊ฐ ์๋ ์ํ์์uv run
์ ์คํํ๋ฉด, UV๋ ์๋์ผ๋ก ๊ฐ์ํ๊ฒฝ์ ์์ฑํ๊ณ ์์กด์ฑ์ ์ค์นํฉ๋๋ค.
๋๊ตฌ ๊ด๋ฆฌ (uvx์ uv tool)
UV๋ Python ๊ธฐ๋ฐ CLI ๋๊ตฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
uv tool - ์๊ตฌ ์ค์น
๋ช ๋ น์ด | ์ค๋ช | ์์ |
---|---|---|
uv tool install <๋๊ตฌ> |
CLI ๋๊ตฌ ์๊ตฌ ์ค์น | uv tool install black |
uv tool uninstall <๋๊ตฌ> |
์ค์น๋ ๋๊ตฌ ์ ๊ฑฐ | uv tool uninstall black |
uv tool list |
์ค์น๋ ๋๊ตฌ ๋ชฉ๋ก ํ์ | uv tool list |
uvx - ์ผํ์ฑ ์คํ
uvx
๋ CLI ๋๊ตฌ๋ฅผ ์์ ํ๊ฒฝ์์ ์คํํ๋ ๋ช
๋ น์ด๋ก, uv tool run
์ ๋ณ์นญ์
๋๋ค.
๋ช ๋ น์ด | ์ค๋ช | ์์ |
---|---|---|
uvx <๋๊ตฌ> [์ธ์] |
๋๊ตฌ ์์ ์ค์น ๋ฐ ์คํ | uvx black . |
uvx --from '<ํจํค์ง>' <๋ช
๋ น์ด> |
ํน์ ํจํค์ง ๋ฒ์ ์ผ๋ก ์คํ | uvx --from 'ruff==0.3.0' ruff check . |
๐ก ์ฑ๋ฅ ์ต์ ํ:
uvx
๋ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋๊ตฌ๋ฅผ ๋ฐ๋ณต ์คํํ ๋ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
UV - ๊ธฐ๋ฅ๋ณ ๋ช ๋ น์ด ์์ฝ
์์์ ์๊ฐํ ๋ด์ฉ๋ค๊ณผ UV์ ์ฃผ์ ๊ธฐ๋ฅ๋ณ ๋ช ๋ น์ด๋ฅผ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
Python ๋ฒ์ ๊ด๋ฆฌ
uv python install
: Python ๋ฒ์ ์ค์นuv python list
: ์ค์น ๊ฐ๋ฅํ ๋ฒ์ ๋ชฉ๋ก ํ์uv python find
: ํ์ฌ ์์คํ ์์ ์ค์น๋ Python ํ์uv python pin
: ํ์ฌ ํ๋ก์ ํธ์ ํน์ ๋ฒ์ ๊ณ ์ uv python uninstall
: ์ค์น๋ ๋ฒ์ ์ ๊ฑฐ
์คํฌ๋ฆฝํธ ์คํ
uv run
: ์คํฌ๋ฆฝํธ ์คํ (๊ฐ์ํ๊ฒฝ ์๋ ์ ์ฉ)uv add --script
: ์คํฌ๋ฆฝํธ ์ ์ฉ ์์กด์ฑ ์ถ๊ฐuv remove --script
: ์คํฌ๋ฆฝํธ ์์กด์ฑ ์ ๊ฑฐ
ํ๋ก์ ํธ ๊ด๋ฆฌ
uv init
: ํ๋ก์ ํธ ์ด๊ธฐํ (pyproject.toml ์์ฑ)uv add
: ํ๋ก์ ํธ ์์กด์ฑ ์ถ๊ฐuv remove
: ํ๋ก์ ํธ ์์กด์ฑ ์ ๊ฑฐuv sync
: ํ๊ฒฝ ๋๊ธฐํ (uv.lock
๊ธฐ๋ฐ)uv lock
: ๋ฝํ์ผ ์์ฑ ๋ฐ ์ ๋ฐ์ดํธuv run
: ํ๋ก์ ํธ ํ๊ฒฝ ๋ด ๋ช ๋ น์ด ์คํuv tree
: ์์กด์ฑ ํธ๋ฆฌ ์๊ฐํuv build
: ํ๋ก์ ํธ ๋น๋uv publish
: ํจํค์ง ๋ฐฐํฌ
๋๊ตฌ ์คํ ๋ฐ ๊ด๋ฆฌ
uvx
๋๋uv tool run
: ์์ ํ๊ฒฝ์์ ๋๊ตฌ ์คํuv tool install
: ์ฌ์ฉ์ ์ ์ญ ๋๊ตฌ ์ค์นuv tool uninstall
: ์ ์ญ ๋๊ตฌ ์ ๊ฑฐuv tool list
: ์ค์น๋ ๋๊ตฌ ๋ชฉ๋กuv tool update-shell
: PATH ๋ฐ์ ๋ฑ ์ ์ ๋ฐ์ดํธ
ํจํค์ง ๋ฐ ํ๊ฒฝ ๊ด๋ฆฌ (pip ํธํ ๋ ๋ฒจ)
uv venv
: ๊ฐ์ํ๊ฒฝ ์์ฑ (venv ๋์ฒด)uv pip install
: ํจํค์ง ์ค์นuv pip uninstall
: ํจํค์ง ์ ๊ฑฐuv pip freeze
: ํจํค์ง ๋ชฉ๋ก ์ถ๋ ฅ (๋ฒ์ ํฌํจ)uv pip show
: ์ค์น๋ ํจํค์ง ์์ธ ์ ๋ณดuv pip check
: ํจํค์ง ํธํ์ฑ ๊ฒ์ฌuv pip list
: ์ค์น๋ ํจํค์ง ๋์ดuv pip tree
: ์์กด์ฑ ํธ๋ฆฌ ํ์ธ
๊ณ ๊ธ ํ๊ฒฝ ๊ด๋ฆฌ (pip-tools ํธํ ๋ ๋ฒจ)
uv pip compile
: requirements.txt์์ ๋ฝํ์ผ ์์ฑuv pip sync
: ๋ฝํ์ผ ๊ธฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ฑ ๋๊ธฐํ
๊ฐ๊ฐ์ ๋ช ๋ น์ด๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉํ ์๋ ์์ผ๋ฉฐ, ์กฐํฉํ์ฌ ์์ ํ Python ๊ฐ๋ฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
-
์ค๋ฌด ์ ์ฉ ์ํฌํ๋ก์ฐ
๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ํ๋ก์ ํธ ํ ํ๋ฆฟ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1. ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ ์์ฑ
mkdir ds-project
cd ds-project
# 2. ํ๋ก์ ํธ ์ด๊ธฐํ ๋ฐ Python ๋ฒ์ ์ค์
uv init --package
uv python install 3.11
uv use 3.11
# 3. ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ํต์ฌ ํจํค์ง ์ค์น
uv add numpy pandas matplotlib scikit-learn
# 4. ๊ฐ๋ฐ ๋๊ตฌ ์ค์น
uv add --dev ipython jupyterlab black ruff
# 5. ํ๊ฒฝ ์ ๊ธ ๋ฐ ๋๊ธฐํ
uv lock
uv sync
# 6. Jupyter Lab ์คํ
uv run jupyter lab
์ด ํ ํ๋ฆฟ์ ์ฌ์ฉํ๋ฉด ์ผ๊ด๋ ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค ํ๊ฒฝ์ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์น ๊ฐ๋ฐ ํ๋ก์ ํธ ํ ํ๋ฆฟ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1. ํ๋ก์ ํธ ์์ฑ
mkdir web-project
cd web-project
# 2. ํ๋ก์ ํธ ์ด๊ธฐํ
uv init --package
uv python install 3.12
uv use 3.12
# 3. ์น ํ๋ ์์ํฌ ๋ฐ ๊ด๋ จ ํจํค์ง ์ค์น
uv add "fastapi>=0.104.0" "uvicorn[standard]" sqlalchemy pydantic
# 4. ๊ฐ๋ฐ ๋๊ตฌ ์ค์น
uv add --dev pytest pytest-cov black ruff
# 5. ํ๊ฒฝ ์ ๊ธ ๋ฐ ๋๊ธฐํ
uv lock
uv sync
# 6. ๊ฐ๋ฐ ์๋ฒ ์คํ
uv run uvicorn src.main:app --reload
๊ธฐ์กด ํ๋ก์ ํธ ๋ง์ด๊ทธ๋ ์ด์
๊ธฐ์กด์ requirements.txt
๋๋ Pipfile
๊ธฐ๋ฐ ํ๋ก์ ํธ๋ฅผ UV๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๋ฐฉ๋ฒ:
1
2
3
4
5
6
7
8
9
10
11
12
# 1. ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd existing-project
# 2. UV ํ๋ก์ ํธ ์ด๊ธฐํ
uv init
# 3. requirements.txt๊ฐ ์๋ ๊ฒฝ์ฐ ์์กด์ฑ ๊ฐ์ ธ์ค๊ธฐ
cat requirements.txt | xargs uv add
# 4. ํ๊ฒฝ ์ ๊ธ ๋ฐ ๋๊ธฐํ
uv lock
uv sync
๐ก ํ ํ์ ํ:
uv.lock
ํ์ผ์ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ํฌํจํ์ฌ ๋ชจ๋ ํ์์ด ๋์ผํ ํ๊ฒฝ์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
-
UV vs ๊ธฐ์กด ๋๊ตฌ ๋น๊ต
๊ธฐ๋ฅ | ๊ธฐ์กด ๋๊ตฌ | UV | UV์ ์ฅ์ |
---|---|---|---|
Python ์ค์น | pyenv install 3.11 |
uv python install 3.11 |
๋น ๋ฅธ ์ค์น, ์๋ ํ๊ฒฝ ์ค์ |
๊ฐ์ํ๊ฒฝ ์์ฑ | python -m venv .venv |
uv venv .venv |
10๋ฐฐ ์ด์ ๋น ๋ฅธ ์๋ |
ํจํค์ง ์ค์น | pip install requests |
uv add requests |
์์กด์ฑ ์๋ ๊ด๋ฆฌ, ํ๋ ๋งํฌ ํ์ฉ |
์์กด์ฑ ๊ณ ์ | pip freeze > requirements.txt |
uv lock |
์ ํํ ์์กด์ฑ ํด๊ฒฐ, ํ๋ซํผ๋ณ ์ต์ ํ |
ํ๊ฒฝ ๋๊ธฐํ | pip install -r requirements.txt |
uv sync |
๋น ๋ฅธ ์ค์น, ํ์คํ ์ฌํ์ฑ |
๋๊ตฌ ์คํ | pipx run black . |
uvx black . |
์บ์ฑ ํ์ฉ, ๋น ๋ฅธ ์คํ |
์ฑ๋ฅ ๋น๊ต
๋ค์์ ๋์ผํ ํ๊ฒฝ์์ ๊ฐ ๋๊ตฌ์ ์ฑ๋ฅ์ ๋น๊ตํ ์์์ ๋๋ค:
์์ | ๊ธฐ์กด ๋๊ตฌ | UV | ์๋ ํฅ์ |
---|---|---|---|
๊ฐ์ํ๊ฒฝ ์์ฑ | 2-3์ด | 0.2-0.3์ด | ~10๋ฐฐ |
pandas ์ค์น | 15-20์ด | 2-3์ด | ~7๋ฐฐ |
ํ๋ก์ ํธ ํ๊ฒฝ ๋๊ธฐํ | 30-60์ด | 3-6์ด | ~10๋ฐฐ |
-
๊ณ ๊ธ ์ฌ์ฉ๋ฒ ๋ฐ ํ
์ปค์คํ ์ธ๋ฑ์ค ์ฌ์ฉ
ํน์ ํจํค์ง ์ธ๋ฑ์ค(PyPI ์ธ์ ์์ค)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ:
1
2
3
4
5
6
# ํน์ ์ธ๋ฑ์ค์์ ํจํค์ง ์ค์น
uv pip install --index-url https://my-custom-index.org/simple some-package
# pyproject.toml์ ์ธ๋ฑ์ค ์ถ๊ฐ
# [tool.uv]
# index-url = "https://my-custom-index.org/simple"
๋น๋ ๋ฐ ๋ฐฐํฌ
UV๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง๋ฅผ ๋น๋ํ๊ณ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ:
1
2
3
4
5
# ํจํค์ง ๋น๋
uv build
# PyPI์ ๋ฐฐํฌ
uv publish
ํ๊ฒฝ ๋ด๋ณด๋ด๊ธฐ ๋ฐ ๊ฐ์ ธ์ค๊ธฐ
๋ค๋ฅธ ๋๊ตฌ์์ ํธํ์ฑ์ ์ํ ํ๊ฒฝ ๋ด๋ณด๋ด๊ธฐ:
1
2
3
4
5
# requirements.txt๋ก ๋ด๋ณด๋ด๊ธฐ
uv pip freeze > requirements.txt
# Poetry ํ์์ผ๋ก ๋ด๋ณด๋ด๊ธฐ
uv export -f poetry > pyproject.toml
๋๋ฒ๊น ๋ฐ ๋ฌธ์ ํด๊ฒฐ
UV ์ฌ์ฉ ์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ:
1
2
3
4
5
6
7
8
# ์์ธํ ๋ก๊ทธ ์ถ๋ ฅ
uv --verbose add requests
# ์บ์ ์ ๋ฆฌ
uv cache clean
# ์์กด์ฑ ํธ๋ฆฌ ํ์ธ
uv pip show --tree pandas
-
์ค๋ฌด ์ ์ฉ ์ฌ๋ก
๋๊ท๋ชจ ML ํ๋ก์ ํธ
๋๊ท๋ชจ ๋จธ์ ๋ฌ๋ ํ๋ก์ ํธ์์ UV๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์์กด์ฑ ํด๊ฒฐ ๋ฐ ํ๊ฒฝ ์ค์ ์๊ฐ์ด ๊ธฐ์กด ๋๋น 85% ๊ฐ์ํ์ต๋๋ค. ํนํ GPU ๋๋ผ์ด๋ฒ์ ํธํ๋๋ ์ ํํ ํจํค์ง ๋ฒ์ ์ ๋น ๋ฅด๊ฒ ์ค์นํ ์ ์์ด ์์ฐ์ฑ์ด ํฌ๊ฒ ํฅ์๋์์ต๋๋ค.
CI/CD ํ์ดํ๋ผ์ธ
CI/CD ํ์ดํ๋ผ์ธ์์ UV๋ฅผ ํ์ฉํ ๊ฒฝ์ฐ, ๋น๋ ์๊ฐ์ด ํ๊ท 72% ๋จ์ถ๋์์ต๋๋ค. ํ๋ ๋งํฌ๋ฅผ ํ์ฉํ ๋์คํฌ ๊ณต๊ฐ ์ต์ ํ๋ก ํด๋ผ์ฐ๋ ํ๊ฒฝ์์์ ๋ฆฌ์์ค ํ์ฉ๋ ๊ฐ์ ๋์์ต๋๋ค.
๋ง์ดํฌ๋ก์๋น์ค ๊ฐ๋ฐ
์ฌ๋ฌ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๊ตฌ์ฑ๋ ํ๋ก์ ํธ์์ UV๋ฅผ ํตํด ์ผ๊ด๋ ํ๊ฒฝ์ ์ ์งํ๋ฉด์๋ ๊ฐ ์๋น์ค๋ณ ์์กด์ฑ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์์ต๋๋ค. ํนํ uvx
๋ฅผ ํตํ ๋๊ตฌ ์คํ์ผ๋ก ๊ฐ๋ฐ์ ๊ฐ ์ผ๊ด๋ ์ฝ๋ ํ์ง์ ์ ์งํ ์ ์์์ต๋๋ค.
-
๊ฒฐ๋ก
UV๋ Python ๊ฐ๋ฐ ํ๊ฒฝ ๊ด๋ฆฌ๋ฅผ ์ํ ์๋ก์ด ํ์ค์ ์ ์ํฉ๋๋ค. Rust ๊ธฐ๋ฐ์ ๋ฐ์ด๋ ์ฑ๋ฅ๊ณผ ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ธฐ์กด ๋๊ตฌ๋ค์ ๋ณต์ก์ฑ์ ํด์ํ๊ณ , ํ๋ก์ ํธ ์์ฑ๋ถํฐ ๋ฐฐํฌ๊น์ง ์ผ๊ด๋ ์ํฌํ๋ก์ฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๐ ์ฃผ์ ์ฅ์ :
- ๋จ์ผ ๋๊ตฌ: ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ๋์ฒดํ๋ ํตํฉ๋ ์ธํฐํ์ด์ค
- ์๋: ๊ธฐ์กด ๋๊ตฌ ๋๋น 10๋ฐฐ ์ด์ ๋น ๋ฅธ ์ฑ๋ฅ
- ๊ณต๊ฐ ํจ์จ์ฑ: ํ๋ ๋งํฌ๋ฅผ ํตํ ๋์คํฌ ๊ณต๊ฐ ์ต์ ํ
- ์ฌํ์ฑ: ์ ํํ ์์กด์ฑ ํด๊ฒฐ๊ณผ ์ ๊ธ ๊ธฐ๋ฅ
- ํ๋์ : PEP 621 ๊ธฐ๋ฐ์
pyproject.toml
์ง์
UV๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ Python ๊ฐ๋ฐ์๋ ํ๊ฒฝ ์ค์ ์ ์์๋๋ ์๊ฐ์ ์ค์ด๊ณ , ์ค์ ๊ฐ๋ฐ์ ๋ ์ง์คํ ์ ์์ต๋๋ค. ๋น ๋ฅด๊ณ ๊ฐ๊ฒฐํ ํ๊ฒฝ ๊ด๋ฆฌ๋ฅผ ํตํด ๋ ๋์ Python ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ UV๋ก์ ์ ํ์ ๊ณ ๋ คํด๋ณด์ธ์!!
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐