UV๋ Rust๋ก ๊ตฌํ๋ ์ด๊ณ ์ Python ํ๊ฒฝ ๊ด๋ฆฌ ๋๊ตฌ๋ก, Python ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ฐ์ฅ ๋น ๋ฅด๊ณ ๊ฐ๋จํ๋ฉฐ ๊ฐ๋ ฅํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๊ธฐ์กด์ ์ฌ๋ฌ ๋๊ตฌ๋ค(pyenv
, pip
, pipenv
, venv
๋ฑ)์ ํ๋๋ก ํตํฉํ์ต๋๋ค.
(๊นํ๋ธ) https://github.com/astral-sh/uv/blob/main/README.md
์ด ๊ฐ์ด๋์์๋ UV์ ํต์ฌ ๊ธฐ๋ฅ
๊ณผ ์ค๋ฌด ์ ์ฉ ๋ฐฉ๋ฒ
์ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
UV๋ Astral์์ ๊ฐ๋ฐํ Rust ๊ธฐ๋ฐ์ Python ํ๊ฒฝ ๊ด๋ฆฌ ๋๊ตฌ
๋ก, Python ์ํ๊ณ์์ ์ฌ์ฉ๋๋ ๋ค์ํ ๋๊ตฌ๋ค์ ํ๋์ ํตํฉ๋ CLI๋ก ์ ๊ณตํฉ๋๋ค.
pip
, pip-tools
, pipx
, poetry
, pyenv
, twine
, virtualenv
๋ฑ์ ๋์ฒดํ ์ ์์ต๋๋ค.pyproject.toml
์ ํ์ค์ผ๋ก ์ฌ์ฉํ์ฌ PEP 621 ์ค์https://docs.astral.sh/uv/getting-started/installation/#standalone-installer
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
curl -LsSf https://astral.sh/uv/install.sh | sh
pip install uv
uv --version
๐ก ์ฐธ๊ณ : UV๋ฅผ ์ ์ญ์ผ๋ก ์ค์นํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
pip install uv
๋ก ์ค์นํ ๊ฒฝ์ฐ ํน์ ํ๊ฒฝ์ ์ข ์๋๊ธฐ ๋๋ฌธ์, ์์ ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ์ค์น ๋ฐฉ๋ฒ์ด ๋ ํจ๊ณผ์ ์ ๋๋ค.
์ต์ ํ์ด์ฌ ์ค์นํ๊ธฐ:
uv python install
ํน์ ๋ฒ์ ํ์ด์ฌ ์ค์นํ๊ธฐ:
uv python install 3.12
(๋ณต์๊ฐ) ํน์ ๋ฒ์ ํ์ด์ฌ ์ค์นํ๊ธฐ:
uv python install 3.11 3.12
์ค์น ์ ์๋ฌ, ๋๋ ๋ค์ ์ค์น๊ฐ ํ์ํ ๊ฒฝ์ฐ
uv python install --reinstall
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
ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์ต์ํ์ ๊ตฌ์ฑ์์๋ง ๋ค์ด๋ก๋ํฉ๋๋ค.
UV๋ ํ๋ก์ ํธ ์ด๊ธฐํ๋ฅผ ์ํ ๊ฐ๋จํ ๋ช ๋ น์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ช ๋ น์ด | ์ค๋ช | ์์ฑ๋๋ ํ์ผ/๋๋ ํ ๋ฆฌ |
---|---|---|
uv init | ๊ธฐ๋ณธ ํ๋ก์ ํธ ์ด๊ธฐํ | pyproject.toml , .python-version |
uv init --package | ํจํค์ง ํํ ํ๋ก์ ํธ ์์ฑ | pyproject.toml , .python-version , src/ ๋๋ ํ ๋ฆฌ |
uv init --lib | ๋ฐฐํฌ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ก์ ํธ ์์ฑ | ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์กฐ์ pyproject.toml , ํ
์คํธ ๋๋ ํ ๋ฆฌ ๋ฑ |
๐ผ pyproject.toml
์์:
[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
์์:
# ํน์ 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
์์ฑ๋จ.venv๊ฐ ์กด์ฌํ์ง ์๊ฑฐ๋
or ์๋ก์ด ํ๊ฒฝ์ ๋ง๋ค์์ ๊ฒฝ์ฐ
uv sync
๋ pyproject.toml
๊ณผ uv.lock
์ ๊ธฐ์ค์ผ๋ก ํ์ํ ํจํค์ง๋ฅผ .venv
(ํน์ ๋ค๋ฅธ ์ง์ ๋ ๊ฐ์ํ๊ฒฝ) ์ ์ค์นํ์ฌ ํ๊ฒฝ์ ์ผ๊ด์ฑ ์๊ฒ ์ฌํํ๋ ์์
์ ์ํํฉ๋๋ค.๐ก ์ฑ๋ฅ ์ด์ : UV๋ก ์์ฑํ ๊ฐ์ํ๊ฒฝ์ ํ์ค
venv
๋ชจ๋๋ก ์์ฑํ ๊ฒ๊ณผ ํธํ๋์ง๋ง, ์์ฑ ์๋๊ฐ ํจ์ฌ ๋น ๋ฆ ๋๋ค.
uv venv
์ uv init
์ ๋ชฉ์ ๊ณผ ์ฌ์ฉ ์๋๋ฆฌ์ค๊ฐ ๋ค๋ฆ
๋๋ค:
uv venv
.venv
๋๋ ํ ๋ฆฌ)pyproject.toml
) ์์ฑํ์ง ์์uv init
pyproject.toml
, .python-version
๋ฐ ๊ธฐํ ํ๋ก์ ํธ ํ์ผuv sync
, uv add
๋ฑ) ์คํ ์ ์๋์ผ๋ก ์์ฑUV์ ํฐ ์ฅ์ ์ค ํ๋๋ ์ ํต์ ์ธ ๊ฐ์ํ๊ฒฝ ํ์ฑํ(activate) ๊ณผ์ ์ด ํ์ ์๋ค๋ ์ ์ ๋๋ค.
uv run python script.py
uv add requests
uv run -- python -c "import sys; print(sys.prefix)"
Windows
.\.venv\Scripts\Activate.ps1
.\.venv\Scripts\activate.bat
macOS/Linux
source .venv/bin/activate
Windows
.\.venv\Scripts\python script.py
macOS/Linux
./.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 |
๐ผ ์์กด์ฑ ๋ฒ์ ์ง์ ์์:
# ํน์ ๋ฒ์ ์ค์น
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 |
๐ผ ์์ - ์์ฃผ ์ฌ์ฉํ๋ ๋ช ๋ น์ด:
# Jupyter Lab ์คํ
uv run jupyter lab
# ํ
์คํธ ์คํ
uv run pytest
๐ก ์๋ ๊ฐ์ํ๊ฒฝ ์์ฑ:
.venv
๊ฐ ์๋ ์ํ์์uv run
์ ์คํํ๋ฉด, UV๋ ์๋์ผ๋ก ๊ฐ์ํ๊ฒฝ์ ์์ฑํ๊ณ ์์กด์ฑ์ ์ค์นํฉ๋๋ค.
UV๋ Python ๊ธฐ๋ฐ CLI ๋๊ตฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
๋ช ๋ น์ด | ์ค๋ช | ์์ |
---|---|---|
uv tool install <๋๊ตฌ> | CLI ๋๊ตฌ ์๊ตฌ ์ค์น | uv tool install black |
uv tool uninstall <๋๊ตฌ> | ์ค์น๋ ๋๊ตฌ ์ ๊ฑฐ | uv tool uninstall black |
uv tool list | ์ค์น๋ ๋๊ตฌ ๋ชฉ๋ก ํ์ | uv tool list |
uvx
๋ CLI ๋๊ตฌ๋ฅผ ์์ ํ๊ฒฝ์์ ์คํํ๋ ๋ช
๋ น์ด๋ก, uv tool run
์ ๋ณ์นญ์
๋๋ค.
๋ช ๋ น์ด | ์ค๋ช | ์์ |
---|---|---|
uvx <๋๊ตฌ> [์ธ์] | ๋๊ตฌ ์์ ์ค์น ๋ฐ ์คํ | uvx black . |
uvx --from '<ํจํค์ง>' <๋ช
๋ น์ด> | ํน์ ํจํค์ง ๋ฒ์ ์ผ๋ก ์คํ | uvx --from 'ruff==0.3.0' ruff check . |
๐ก ์ฑ๋ฅ ์ต์ ํ:
uvx
๋ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋๊ตฌ๋ฅผ ๋ฐ๋ณต ์คํํ ๋ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
์์์ ์๊ฐํ ๋ด์ฉ๋ค๊ณผ UV์ ์ฃผ์ ๊ธฐ๋ฅ๋ณ ๋ช ๋ น์ด๋ฅผ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
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 ๋ฐ์ ๋ฑ ์ ์
๋ฐ์ดํธuv venv
: ๊ฐ์ํ๊ฒฝ ์์ฑ (venv ๋์ฒด)uv pip install
: ํจํค์ง ์ค์นuv pip uninstall
: ํจํค์ง ์ ๊ฑฐuv pip freeze
: ํจํค์ง ๋ชฉ๋ก ์ถ๋ ฅ (๋ฒ์ ํฌํจ)uv pip show
: ์ค์น๋ ํจํค์ง ์์ธ ์ ๋ณดuv pip check
: ํจํค์ง ํธํ์ฑ ๊ฒ์ฌuv pip list
: ์ค์น๋ ํจํค์ง ๋์ดuv pip tree
: ์์กด์ฑ ํธ๋ฆฌ ํ์ธuv pip compile
: requirements.txt์์ ๋ฝํ์ผ ์์ฑuv pip sync
: ๋ฝํ์ผ ๊ธฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ฑ ๋๊ธฐํ๊ฐ๊ฐ์ ๋ช ๋ น์ด๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉํ ์๋ ์์ผ๋ฉฐ, ์กฐํฉํ์ฌ ์์ ํ Python ๊ฐ๋ฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
# 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. ํ๋ก์ ํธ ์์ฑ
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. ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd existing-project
# 2. UV ํ๋ก์ ํธ ์ด๊ธฐํ
uv init
# 3. requirements.txt๊ฐ ์๋ ๊ฒฝ์ฐ ์์กด์ฑ ๊ฐ์ ธ์ค๊ธฐ
cat requirements.txt | xargs uv add
# 4. ํ๊ฒฝ ์ ๊ธ ๋ฐ ๋๊ธฐํ
uv lock
uv sync
๐ก ํ ํ์ ํ:
uv.lock
ํ์ผ์ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ํฌํจํ์ฌ ๋ชจ๋ ํ์์ด ๋์ผํ ํ๊ฒฝ์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
๊ธฐ๋ฅ | ๊ธฐ์กด ๋๊ตฌ | 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 ์ธ์ ์์ค)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ:
# ํน์ ์ธ๋ฑ์ค์์ ํจํค์ง ์ค์น
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๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง๋ฅผ ๋น๋ํ๊ณ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ:
# ํจํค์ง ๋น๋
uv build
# PyPI์ ๋ฐฐํฌ
uv publish
๋ค๋ฅธ ๋๊ตฌ์์ ํธํ์ฑ์ ์ํ ํ๊ฒฝ ๋ด๋ณด๋ด๊ธฐ:
# requirements.txt๋ก ๋ด๋ณด๋ด๊ธฐ
uv pip freeze > requirements.txt
# Poetry ํ์์ผ๋ก ๋ด๋ณด๋ด๊ธฐ
uv export -f poetry > pyproject.toml
UV ์ฌ์ฉ ์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ:
# ์์ธํ ๋ก๊ทธ ์ถ๋ ฅ
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 ๊ธฐ๋ฐ์ ๋ฐ์ด๋ ์ฑ๋ฅ๊ณผ ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ธฐ์กด ๋๊ตฌ๋ค์ ๋ณต์ก์ฑ์ ํด์ํ๊ณ , ํ๋ก์ ํธ ์์ฑ๋ถํฐ ๋ฐฐํฌ๊น์ง ์ผ๊ด๋ ์ํฌํ๋ก์ฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๐ ์ฃผ์ ์ฅ์ :
pyproject.toml
์ง์UV๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ Python ๊ฐ๋ฐ์๋ ํ๊ฒฝ ์ค์ ์ ์์๋๋ ์๊ฐ์ ์ค์ด๊ณ , ์ค์ ๊ฐ๋ฐ์ ๋ ์ง์คํ ์ ์์ต๋๋ค. ๋น ๋ฅด๊ณ ๊ฐ๊ฒฐํ ํ๊ฒฝ ๊ด๋ฆฌ๋ฅผ ํตํด ๋ ๋์ Python ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ UV๋ก์ ์ ํ์ ๊ณ ๋ คํด๋ณด์ธ์!!
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐