๐ uv๋ก Python ํ๋ก์ ํธ ๊ด๋ฆฌํ๊ธฐ
uv๋ Python ํ๋ก์ ํธ์์ ํจํค์ง ๊ด๋ฆฌ + ๊ฐ์ํ๊ฒฝ + Python ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ ๋ฒ์ ํด๊ฒฐํด์ฃผ๋ ์ต์ ๋๊ตฌ์
๋๋ค. Rust๋ก ์์ฑ๋์ด ๊ธฐ์กด pip๋ณด๋ค 10~100๋ฐฐ ๋น ๋ฅด๋ฉฐ, pip, venv, pyenv๋ฅผ ๋์ฒดํ ์ ์๋ ์ฌ์ธ์ ํด์
๋๋ค โก
์ด ๊ธ์์๋ ์ค๋ฌด์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋๋ก ์ ํํ ๋ช
๋ น์ด ๊ธฐ์ค์ผ๋ก ๊น๋ํ๊ฒ ์ ๋ฆฌํ์ต๋๋ค.
๐ฅ ์ค์นํ๊ธฐ
macOS / Linux
1
| curl -LsSf https://astral.sh/uv/install.sh | sh
|
Windows
1
| powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
|
pip์ผ๋ก ์ค์น
์ค์น ํ ๋ฒ์ ํ์ธ:
1๏ธโฃ ํ๋ก์ ํธ ์์ฑ ๋ฐ ์ค์
๐ฆ ํ๋ก์ ํธ ์์ฑ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์๋ก์ด ํ์ด์ฌ ํ๋ก์ ํธ ํ๊ฒฝ์ ์ด๊ธฐํํ๋ ๊ธฐ๋ณธ์ ์ธ ํ์ผ๊ณผ ํด๋ ๊ตฌ์กฐ๊ฐ ์๋์ผ๋ก ์์ฑ
uv init
# ๊ธฐ๋ณธ ํ๋ก์ ํธ ์์ฑ
uv init my-project
# ์ค์ ํ์ผ๋ง ํ์ํ๋ค๋ฉด
uv init --bare
# ํน์ Python ๋ฒ์ ์ผ๋ก ์์ฑ
uv init my-project --python 3.11
# ๊ฐ์ํ๊ฒฝ ์์ด ์์ฑ
uv init my-project --no-venv
|
โ ๏ธ ๋ง์ฝ error: Failed to discover parent workspace; ๊ฐ ๋ฐ์ํ๋ค๋ฉด --no-workspace ์ต์
์ ๋ฃ์ด์ฃผ์ด ํ๋ก์ ํธ๋ฅผ ์์ฑ
๐ uv init ์ ์์ฑ๋๋ ํ์ผ
uv init ์คํ ํ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์ ์๋ ํ์ผ๋ค์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
1
2
3
4
5
6
7
| my-project/
โโโ pyproject.toml # ํ๋ก์ ํธ ๋ฉํ๋ฐ์ดํฐ ๋ฐ ์์กด์ฑ ์ ์
โโโ .python-version # ์ฌ์ฉํ Python ๋ฒ์ ๊ณ ์
โโโ uv.lock # ์์กด์ฑ ๋ฒ์ ์ ๊ธ ํ์ผ (์๋ ์์ฑ)
โโโ .venv/ # ๊ฐ์ํ๊ฒฝ ๋๋ ํ ๋ฆฌ
โโโ src/
โโโ main.py # ๊ธฐ๋ณธ ์ง์
์
|
Tip: uv.lock ํ์ผ์ git์ ํฌํจํด์ผ ํ์ ์ ์ฒด๊ฐ ๋์ผํ ์์กด์ฑ ํ๊ฒฝ์ ๋ณด์ฅ๋ฐ์ ์ ์์ต๋๋ค.
๐ ์์กด์ฑ ๊ด๋ฆฌ
1
2
3
4
5
6
7
8
9
10
11
| # ํจํค์ง ์ถ๊ฐ
uv add requests
# ํน์ ๋ฒ์ ์ถ๊ฐ
uv add requests==2.31.0
# ๊ฐ๋ฐ ์์กด์ฑ ์ถ๊ฐ
uv add --dev pytest
# ๋ก์ปฌ ํจํค์ง (editable ๋ชจ๋)
uv add -e ./localpackage
|
โ ์์กด์ฑ ์ ๊ฑฐ
1
2
| uv remove requests
uv remove --dev pytest
|
๐ ์์กด์ฑ ๋๊ธฐํ
1
2
3
| uv sync # ์ ์ฒด ์ค์น
uv sync --dev # ๊ฐ๋ฐ ์์กด์ฑ ํฌํจ
uv sync --no-dev # ๊ฐ๋ฐ ์์กด์ฑ ์ ์ธ
|
๐ ์์กด์ฑ ์ ๊ธ
1
2
3
| uv lock
uv lock --dev
uv lock --no-dev
|
2๏ธโฃ ํจํค์ง ์ค์น (pip ์คํ์ผ)
๐ฅ ๊ธฐ๋ณธ ์ค์น
1
| uv pip install requests
|
๐ฏ ํน์ ๋ฒ์ ์ค์น
1
2
3
| uv pip install "requests==2.31.0"
uv pip install "requests>=2.31.0"
uv pip install "requests<3.0.0"
|
๐งช ๊ฐ๋ฐ ๋๊ตฌ ์ค์น
1
2
| uv pip install --dev pytest
uv pip install --dev black isort mypy
|
โ ํจํค์ง ์ ๊ฑฐ
1
2
| uv pip uninstall requests
uv pip uninstall -y requests
|
โฌ๏ธ ํจํค์ง ์
๊ทธ๋ ์ด๋
1
2
| uv pip install --upgrade requests
uv pip install --upgrade pip
|
๐ ํจํค์ง ์กฐํ
1
2
3
4
5
| uv pip search "data science"
uv pip show requests
uv pip list
uv pip list outdated
uv pip freeze # ํ์ฌ ํ๊ฒฝ์ ์์กด์ฑ requirements ํ์์ผ๋ก ์ถ๋ ฅ
|
๐ค uv add vs uv pip install ์ฐจ์ด
๋ ๋ช
๋ น์ด ๋ชจ๋ ํจํค์ง๋ฅผ ์ค์นํ์ง๋ง ์ฌ์ฉ ๋ชฉ์ ์ด ๋ค๋ฆ
๋๋ค.
| ๊ตฌ๋ถ | uv add | uv pip install |
|---|
| ์ฉ๋ | ํ๋ก์ ํธ ์์กด์ฑ์ผ๋ก ๋ฑ๋ก | ์ฆ์ ์ค์น (pip ํธํ) |
| pyproject.toml | โ
์๋ ์
๋ฐ์ดํธ | โ ์
๋ฐ์ดํธ ์ ํจ |
| uv.lock | โ
์๋ ๊ฐฑ์ | โ ๊ฐฑ์ ์ ํจ |
| ์ถ์ฒ ์ํฉ | ํ ํ๋ก์ ํธ, ๊ณต์ ํ๊ฒฝ | ์ผํ์ฑ ์ค์น, ์์ ํ
์คํธ |
Tip: ํ ํ๋ก์ ํธ์์๋ uv add๋ฅผ ์ฌ์ฉํด์ผ pyproject.toml๊ณผ uv.lock์ด ์
๋ฐ์ดํธ๋์ด ํ์๊ณผ ํ๊ฒฝ์ ๊ณต์ ํ ์ ์์ต๋๋ค.
3๏ธโฃ ๊ฐ์ํ๊ฒฝ ๊ด๋ฆฌ
๐๏ธ ๊ฐ์ํ๊ฒฝ ์์ฑ
1
2
3
4
| uv venv
uv venv --python 3.11
uv venv --name myenv
uv venv --clear
|
โถ๏ธ ๊ฐ์ํ๊ฒฝ ํ์ฑํ
macOS / Linux
1
2
| source .venv/bin/activate
source myenv/bin/activate
|
Windows
1
2
| .venv\Scripts\activate
myenv\Scripts\activate
|
โ ๊ฐ์ํ๊ฒฝ ๋นํ์ฑํ
4๏ธโฃ Python ๋ฒ์ ๊ด๋ฆฌ
๐ฆ Python ์ค์น
1
2
3
| uv python install 3.11
uv python install 3.11.0
uv python install 3.11 --force
|
๐งฐ ๋ฒ์ ๊ด๋ฆฌ
1
2
3
| uv python list
uv python remove 3.11
uv python pin 3.11
|
โถ๏ธ ํน์ ๋ฒ์ ์คํ
1
2
| uv run --python 3.11 script.py
uv run --python 3.11 -m pytest
|
5๏ธโฃ ์คํฌ๋ฆฝํธ ์คํ
โถ๏ธ ๊ธฐ๋ณธ ์คํ
1
2
| uv run script.py
uv run -m module
|
๐ฆ ์์กด์ฑ๊ณผ ํจ๊ป ์คํ
1
2
| uv run --with-deps script.py
uv run --no-deps script.py
|
๐๏ธ ์ธ์ ์ ๋ฌ
1
2
| uv run script.py --arg1 value1 --arg2 value2
uv run -m pytest tests/ --verbose
|
๐ ํ๊ฒฝ ๋ณ์ ์ค์
1
| uv run --env VAR1=value1 --env VAR2=value2 script.py
|
โก uv๊ฐ ๋น ๋ฅธ ์ด์
uv๋ ๋จ์ํ โ๋น ๋ฅด๋คโ๋ ๋ง๋ก๋ง ์ค๋ช
๋์ง๋ง, ๊ทธ ์ด์ ๋ ๋ค์ ๊ธฐ์ ๋ค์ ์กฐํฉ์
๋๋ค.
| ๊ธฐ์ | ์ค๋ช
|
|---|
| Rust ๊ตฌํ | ์ปดํ์ผ ์ธ์ด๋ก Python ๋๋น ์คํ ์๋ ์ฐ์ |
| ๋ณ๋ ฌ ์ฒ๋ฆฌ | ์ฌ๋ฌ ํจํค์ง๋ฅผ ๋์์ ๋ค์ด๋ก๋ยท์ค์น |
| ์ ์ญ ์บ์ | ํ ๋ฒ ๋ค์ด๋ก๋ํ ํจํค์ง๋ ํ๋ ๋งํฌ๋ก ์ฌ์ฌ์ฉ (๋์คํฌ ์ ์ฝ) |
| PubGrub ์๊ณ ๋ฆฌ์ฆ | pip์ ์์ฐจ ํ์๋ณด๋ค ํจ์จ์ ์ธ ์์กด์ฑ ํด๊ฒฐ ์๊ณ ๋ฆฌ์ฆ |
| HTTP/2 ์ง์ | ์ฐ๊ฒฐ ํ๋ง์ผ๋ก ๋คํธ์ํฌ ์์ฒญ ํจ์จํ |
๐ pip + venv + pyenv vs uv ๋น๊ต
| ํญ๋ชฉ | ๊ธฐ์กด ๋ฐฉ์ | uv |
|---|
| ํ๋ก์ ํธ ์ด๊ธฐํ | ์๋ ์ค์ | uv init |
| ๊ฐ์ํ๊ฒฝ ์์ฑ | python -m venv .venv | ์๋ ์์ฑ |
| ๊ฐ์ํ๊ฒฝ ํ์ฑํ | ๋งค๋ฒ ์๋ | uv run ์ ์๋ |
| ํจํค์ง ์ค์น | pip install | uv add / uv pip install |
| ์์กด์ฑ ์ ๊ธ | pip freeze > requirements.txt | uv lock (์๋) |
| Python ๋ฒ์ ๊ด๋ฆฌ | pyenv ๋ณ๋ ์ค์น ํ์ | uv python install ํตํฉ |
| ์์กด์ฑ ํด๊ฒฐ ๋ฐฉ์ | ์์ฐจ ์ฒ๋ฆฌ | ๋ณ๋ ฌ ์ฒ๋ฆฌ (PubGrub) |
| ์บ์ ๋ฐฉ์ | ํ๋ก์ ํธ๋ณ ๊ฐ๋ณ ์ ์ฅ | ์ ์ญ ์บ์ + ํ๋ ๋งํฌ |
| ์๋ | ๊ธฐ์ค (1x) | 10~100x ๋น ๋ฆ |
๐๏ธ ์ค์ ํ๋ก์ ํธ ์์
๋ฐ์ดํฐ ๊ณผํ ํ๋ก์ ํธ
1
2
3
4
5
| uv init data-science-project --python 3.11
cd data-science-project
uv add pandas numpy matplotlib scikit-learn
uv add --dev jupyter notebook
uv run jupyter notebook
|
FastAPI ์น ์๋ฒ
1
2
3
4
5
| uv init web-api --python 3.11
cd web-api
uv add fastapi uvicorn sqlalchemy pydantic
uv add --dev pytest black mypy
uv run uvicorn src.main:app --reload
|
๋จธ์ ๋ฌ๋ ํ๋ก์ ํธ
1
2
3
4
5
| uv init ml-project --python 3.11
cd ml-project
uv add torch torchvision transformers datasets
uv add --dev jupyter wandb tensorboard
uv run python src/train.py
|
๐ก ์ค๋ฌด ํ
- โ
uv sync ํ๋๋ก ํ ํ๊ฒฝ ํต์ผ ๊ฐ๋ฅ - โ
uv lock์ผ๋ก ์์กด์ฑ ์ถฉ๋ ๋ฐฉ์ง - โ
uv run์ผ๋ก Python ๋ฒ์ ๊น์ง ํต์ - โ
pip + venv + pyenv ๋์ฒด ๊ฐ๋ฅ
๐ฏ ์ด๋ฐ ๋ถ๋ค๊ป ์ถ์ฒ
- โก ๋น ๋ฅธ Python ํ๊ฒฝ์ ์ํ์๋ ๋ถ
- ๐งฉ ์์กด์ฑ ๊ด๋ฆฌ์ ์คํธ๋ ์ค ๋ฐ๋ ๋ถ
- ๐ณ Docker / CI ํ๊ฒฝ์์ ์๋ ๊ฐ์ ์ด ํ์ํ ๋ถ
๐ ๋ง๋ฌด๋ฆฌ
uv๋ ๋จ์ํ ํจํค์ง ๋งค๋์ ๊ฐ ์๋๋ผ ๐ Python ๊ฐ๋ฐ ํ๊ฒฝ ์ ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ์ฐจ์ธ๋ ๋๊ตฌ์
๋๋ค.
์์ผ๋ก Python ํ๋ก์ ํธ๋ ์ด๋ ๊ฒ ๊ด๋ฆฌํ๋ ๊ฒ์ด ํ์ค์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค ๐
- โก ๋น ๋ฅธ ํจํค์ง ์ค์น
- ๐งฉ ์์กด์ฑ ๊ด๋ฆฌ ํตํฉ
- ๐ Python ๋ฒ์ ๊ด๋ฆฌ๊น์ง ํ ๋ฒ์
๐ ๊ธฐ์กด pip, venv, pyenv๋ฅผ ๋ฐ๋ก ์ฐ๋ ๋ถ๋ค์๊ฒ ๊ฐ๋ ฅ ์ถ์ฒ!
๐ ์ฐธ๊ณ