Backend ยท Python ยท

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

๐Ÿ uv๋กœ Python ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌํ•˜๊ธฐ #

uv๋Š” Python ํ”„๋กœ์ ํŠธ์—์„œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ + ๊ฐ€์ƒํ™˜๊ฒฝ + Python ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ์ตœ์‹  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Rust๋กœ ์ž‘์„ฑ๋˜์–ด ๊ธฐ์กด pip๋ณด๋‹ค 10~100๋ฐฐ ๋น ๋ฅด๋ฉฐ, pip, venv, pyenv๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ์˜ฌ์ธ์› ํˆด์ž…๋‹ˆ๋‹ค โšก

์ด ๊ธ€์—์„œ๋Š” ์‹ค๋ฌด์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •ํ™•ํ•œ ๋ช…๋ น์–ด ๊ธฐ์ค€์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ฅ ์„ค์น˜ํ•˜๊ธฐ #

macOS / Linux #

1curl -LsSf https://astral.sh/uv/install.sh | sh

Windows #

1powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

pip์œผ๋กœ ์„ค์น˜ #

1pip install uv

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

1uv --version

1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ์„ค์ • #

๐Ÿ“ฆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ #

 1# ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒˆ๋กœ์šด ํŒŒ์ด์ฌ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ํŒŒ์ผ๊ณผ ํด๋” ๊ตฌ์กฐ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
 2uv init
 3
 4# ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
 5uv init my-project
 6
 7# ์„ค์ • ํŒŒ์ผ๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด
 8uv init --bare
 9
10# ํŠน์ • Python ๋ฒ„์ „์œผ๋กœ ์ƒ์„ฑ
11uv init my-project --python 3.11
12
13# ๊ฐ€์ƒํ™˜๊ฒฝ ์—†์ด ์ƒ์„ฑ
14uv init my-project --no-venv

โš ๏ธ ๋งŒ์•ฝ error: Failed to discover parent workspace; ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด --no-workspace ์˜ต์…˜์„ ๋„ฃ์–ด์ฃผ์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ

๐Ÿ“ uv init ์‹œ ์ƒ์„ฑ๋˜๋Š” ํŒŒ์ผ #

uv init ์‹คํ–‰ ํ›„ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— ์•„๋ž˜ ํŒŒ์ผ๋“ค์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

1my-project/
2โ”œโ”€โ”€ pyproject.toml       # ํ”„๋กœ์ ํŠธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ ์˜์กด์„ฑ ์ •์˜
3โ”œโ”€โ”€ .python-version      # ์‚ฌ์šฉํ•  Python ๋ฒ„์ „ ๊ณ ์ •
4โ”œโ”€โ”€ uv.lock              # ์˜์กด์„ฑ ๋ฒ„์ „ ์ž ๊ธˆ ํŒŒ์ผ (์ž๋™ ์ƒ์„ฑ)
5โ”œโ”€โ”€ .venv/               # ๊ฐ€์ƒํ™˜๊ฒฝ ๋””๋ ‰ํ† ๋ฆฌ
6โ””โ”€โ”€ src/
7    โ””โ”€โ”€ main.py          # ๊ธฐ๋ณธ ์ง„์ž…์ 

Tip: uv.lock ํŒŒ์ผ์€ git์— ํฌํ•จํ•ด์•ผ ํŒ€์› ์ „์ฒด๊ฐ€ ๋™์ผํ•œ ์˜์กด์„ฑ ํ™˜๊ฒฝ์„ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“š ์˜์กด์„ฑ ๊ด€๋ฆฌ #

 1# ํŒจํ‚ค์ง€ ์ถ”๊ฐ€
 2uv add requests
 3
 4# ํŠน์ • ๋ฒ„์ „ ์ถ”๊ฐ€
 5uv add requests==2.31.0
 6
 7# ๊ฐœ๋ฐœ ์˜์กด์„ฑ ์ถ”๊ฐ€
 8uv add --dev pytest
 9
10# ๋กœ์ปฌ ํŒจํ‚ค์ง€ (editable ๋ชจ๋“œ)
11uv add -e ./localpackage

โŒ ์˜์กด์„ฑ ์ œ๊ฑฐ #

1uv remove requests
2uv remove --dev pytest

๐Ÿ”„ ์˜์กด์„ฑ ๋™๊ธฐํ™” #

1uv sync                 # ์ „์ฒด ์„ค์น˜
2uv sync --dev           # ๊ฐœ๋ฐœ ์˜์กด์„ฑ ํฌํ•จ
3uv sync --no-dev        # ๊ฐœ๋ฐœ ์˜์กด์„ฑ ์ œ์™ธ

๐Ÿ”’ ์˜์กด์„ฑ ์ž ๊ธˆ #

1uv lock
2uv lock --dev
3uv lock --no-dev

2๏ธโƒฃ ํŒจํ‚ค์ง€ ์„ค์น˜ (pip ์Šคํƒ€์ผ) #

๐Ÿ“ฅ ๊ธฐ๋ณธ ์„ค์น˜ #

1uv pip install requests

๐ŸŽฏ ํŠน์ • ๋ฒ„์ „ ์„ค์น˜ #

1uv pip install "requests==2.31.0"
2uv pip install "requests>=2.31.0"
3uv pip install "requests<3.0.0"

๐Ÿงช ๊ฐœ๋ฐœ ๋„๊ตฌ ์„ค์น˜ #

1uv pip install --dev pytest
2uv pip install --dev black isort mypy

โŒ ํŒจํ‚ค์ง€ ์ œ๊ฑฐ #

1uv pip uninstall requests
2uv pip uninstall -y requests

โฌ†๏ธ ํŒจํ‚ค์ง€ ์—…๊ทธ๋ ˆ์ด๋“œ #

1uv pip install --upgrade requests
2uv pip install --upgrade pip

๐Ÿ” ํŒจํ‚ค์ง€ ์กฐํšŒ #

1uv pip search "data science"
2uv pip show requests
3uv pip list
4uv pip list outdated
5uv 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๏ธโƒฃ ๊ฐ€์ƒํ™˜๊ฒฝ ๊ด€๋ฆฌ #

๐Ÿ—๏ธ ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ #

1uv venv
2uv venv --python 3.11
3uv venv --name myenv
4uv venv --clear

โ–ถ๏ธ ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™” #

macOS / Linux #

1source .venv/bin/activate
2source myenv/bin/activate

Windows #

1.venv\Scripts\activate
2myenv\Scripts\activate

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

1deactivate

4๏ธโƒฃ Python ๋ฒ„์ „ ๊ด€๋ฆฌ #

๐Ÿ“ฆ Python ์„ค์น˜ #

1uv python install 3.11
2uv python install 3.11.0
3uv python install 3.11 --force

๐Ÿงฐ ๋ฒ„์ „ ๊ด€๋ฆฌ #

1uv python list
2uv python remove 3.11
3uv python pin 3.11

โ–ถ๏ธ ํŠน์ • ๋ฒ„์ „ ์‹คํ–‰ #

1uv run --python 3.11 script.py
2uv run --python 3.11 -m pytest

5๏ธโƒฃ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ #

โ–ถ๏ธ ๊ธฐ๋ณธ ์‹คํ–‰ #

1uv run script.py
2uv run -m module

๐Ÿ“ฆ ์˜์กด์„ฑ๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ #

1uv run --with-deps script.py
2uv run --no-deps script.py

๐ŸŽ›๏ธ ์ธ์ž ์ „๋‹ฌ #

1uv run script.py --arg1 value1 --arg2 value2
2uv run -m pytest tests/ --verbose

๐ŸŒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • #

1uv 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 ๋น ๋ฆ„

๐Ÿ—๏ธ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์˜ˆ์ œ #

๋ฐ์ดํ„ฐ ๊ณผํ•™ ํ”„๋กœ์ ํŠธ #

1uv init data-science-project --python 3.11
2cd data-science-project
3uv add pandas numpy matplotlib scikit-learn
4uv add --dev jupyter notebook
5uv run jupyter notebook

FastAPI ์›น ์„œ๋ฒ„ #

1uv init web-api --python 3.11
2cd web-api
3uv add fastapi uvicorn sqlalchemy pydantic
4uv add --dev pytest black mypy
5uv run uvicorn src.main:app --reload

๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋กœ์ ํŠธ #

1uv init ml-project --python 3.11
2cd ml-project
3uv add torch torchvision transformers datasets
4uv add --dev jupyter wandb tensorboard
5uv 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๋ฅผ ๋”ฐ๋กœ ์“ฐ๋˜ ๋ถ„๋“ค์—๊ฒŒ ๊ฐ•๋ ฅ ์ถ”์ฒœ!


๐Ÿ“š ์ฐธ๊ณ  #

Advertisement