Post

[Python] ๐Ÿš€ uv๋กœ ํ”„๋กœ์ ํŠธ & ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

[Python] ๐Ÿš€ uv๋กœ ํ”„๋กœ์ ํŠธ & ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

๐Ÿ 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
pip install uv

์„ค์น˜ ํ›„ ๋ฒ„์ „ ํ™•์ธ:

1
uv --version

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 adduv 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

โ›” ๊ฐ€์ƒํ™˜๊ฒฝ ๋น„ํ™œ์„ฑํ™”

1
deactivate

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 installuv add / uv pip install
์˜์กด์„ฑ ์ž ๊ธˆpip freeze > requirements.txtuv 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๋ฅผ ๋”ฐ๋กœ ์“ฐ๋˜ ๋ถ„๋“ค์—๊ฒŒ ๊ฐ•๋ ฅ ์ถ”์ฒœ!


๐Ÿ“š ์ฐธ๊ณ 

This post is licensed under CC BY 4.0 by the author.