πŸ”₯κ°€μƒν™˜κ²½ uv

HY_1023Β·2026λ…„ 3μ›” 11일

λͺ…λ Ήμ–΄ 정리

λͺ©λ‘ 보기
5/10

uv add λͺ…λ Ήμ–΄λŠ” pyproject.toml 파일이 μžˆμ–΄μ•Ό μž‘λ™ν•©λ‹ˆλ‹€. ν˜„μž¬ 디렉토리에 ν”„λ‘œμ νŠΈκ°€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ μƒνƒœμ˜ˆμš”.

ν•΄κ²° 방법:

# 1. uv ν”„λ‘œμ νŠΈ μ΄ˆκΈ°ν™” (pyproject.toml 생성)
uv init

# 2. κ·Έ λ‹€μŒ νŒ¨ν‚€μ§€ μΆ”κ°€
uv add django djangorestframework

λ˜λŠ” uv init 없이 λ°”λ‘œ ν•˜λ €λ©΄:

# pip λ°©μ‹μœΌλ‘œ 직접 μ„€μΉ˜
uv pip install django djangorestframework

두 λ°©λ²•μ˜ 차이:

λ°©λ²•νŠΉμ§•
uv init β†’ uv addpyproject.toml에 μ˜μ‘΄μ„± 기둝됨 (ꢌμž₯)
uv pip installκ°€μƒν™˜κ²½μ—λ§Œ μ„€μΉ˜, 기둝 μ—†μŒ

Django ν”„λ‘œμ νŠΈλ₯Ό μ œλŒ€λ‘œ κ΄€λ¦¬ν•˜λ €λ©΄ uv init ν›„ uv addλ₯Ό μ“°λŠ” 게 μ’‹μŠ΅λ‹ˆλ‹€. ν˜Ήμ‹œ ~/HY_leverage 폴더가 이미 Django ν”„λ‘œμ νŠΈ ꡬ쑰라면 pyproject.toml만 μ—†λŠ” 건지 ν™•μΈν•΄λ³Όκ²Œμš”:

uv κ°€μƒν™˜κ²½ λͺ…λ Ήμ–΄

κ°€μƒν™˜κ²½ 생성

uv venv                    # κΈ°λ³Έ (.venv 폴더에 생성)
uv venv myenv              # 이름 μ§€μ •
uv venv --python 3.11      # Python 버전 μ§€μ •
uv venv myenv --python 3.12

κ°€μƒν™˜κ²½ ν™œμ„±ν™”

# macOS / Linux
source .venv/bin/activate

# Windows (CMD)
.venv\Scripts\activate.bat

# Windows (PowerShell)
.venv\Scripts\Activate.ps1

κ°€μƒν™˜κ²½ λΉ„ν™œμ„±ν™”

deactivate

νŒ¨ν‚€μ§€ 관리

uv pip install pandas           # νŒ¨ν‚€μ§€ μ„€μΉ˜
uv pip install -r requirements.txt  # requirements.txt둜 μ„€μΉ˜
uv pip uninstall pandas         # νŒ¨ν‚€μ§€ 제거
uv pip list                     # μ„€μΉ˜λœ νŒ¨ν‚€μ§€ λͺ©λ‘
uv pip freeze                   # requirements ν˜•μ‹μœΌλ‘œ 좜λ ₯

κ°€μƒν™˜κ²½ 없이 λ°”λ‘œ μ‹€ν–‰ (νŽΈλ¦¬ν•œ κΈ°λŠ₯)

uv run python script.py         # μžλ™μœΌλ‘œ venv 감지 ν›„ μ‹€ν–‰
uv run --with pandas python script.py  # νŠΉμ • νŒ¨ν‚€μ§€μ™€ ν•¨κ»˜ μ‹€ν–‰

ν”„λ‘œμ νŠΈ μ΄ˆκΈ°ν™” (pyproject.toml 기반)

uv init myproject       # μƒˆ ν”„λ‘œμ νŠΈ 생성
uv add pandas           # μ˜μ‘΄μ„± μΆ”κ°€
uv sync                 # μ˜μ‘΄μ„± 동기화

팁: uvλŠ” pip보닀 10~100λ°° λΉ λ₯΄λ©°, uv run을 μ‚¬μš©ν•˜λ©΄ κ°€μƒν™˜κ²½ ν™œμ„±ν™” 없이도 λ°”λ‘œ μ‹€ν–‰ν•  수 μžˆμ–΄ νŽΈλ¦¬ν•©λ‹ˆλ‹€.


κ°€μƒν™˜κ²½ μ•ˆ vs λ°– μ„€μΉ˜ κΈ°μ€€

βœ… κ°€μƒν™˜κ²½ μ•ˆμ— μ„€μΉ˜ (ν”„λ‘œμ νŠΈλ³„ μ˜μ‘΄μ„±)

ν”„λ‘œμ νŠΈλ§ˆλ‹€ 버전이 λ‹€λ₯Ό 수 μžˆλŠ” 것듀

# ν”„λ ˆμž„μ›Œν¬ / 라이브러리
uv add fastapi django flask
uv add pandas numpy scikit-learn

# 개발 도ꡬ (ν”„λ‘œμ νŠΈ 쒅속)
uv add --dev pytest black ruff mypy
uv add --dev ipykernel jupyter  # 이 ν”„λ‘œμ νŠΈμš© 컀널

κΈ°μ€€: pyproject.toml λ˜λŠ” requirements.txt에 κΈ°λ‘λ˜μ–΄μ•Ό ν•  것듀


🌍 κ°€μƒν™˜κ²½ 밖에 μ„€μΉ˜ (κΈ€λ‘œλ²Œ)

μ–΄λŠ ν”„λ‘œμ νŠΈμ—μ„œλ‚˜ λ™μΌν•˜κ²Œ μ“°λŠ” 도ꡬ듀

# uv 자체
curl -LsSf https://astral.sh/uv/install.sh | sh

# Python 버전 관리
uv python install 3.11
uv python install 3.12

# μ „μ—­ CLI 도ꡬ
pipx install cookiecutter   # ν”„λ‘œμ νŠΈ ν…œν”Œλ¦Ώ
pipx install pre-commit     # git ν›… 관리

κΈ°μ€€: νŠΉμ • ν”„λ‘œμ νŠΈκ°€ μ•„λ‹ˆλΌ 개발 ν™˜κ²½ μžμ²΄μ— ν•„μš”ν•œ 것듀


πŸ€” ν—·κ°ˆλ¦¬λŠ” 것듀

λ„κ΅¬κΆŒμž₯ μœ„μΉ˜μ΄μœ 
black, ruffκ°€μƒν™˜κ²½ μ•ˆν”„λ‘œμ νŠΈλ§ˆλ‹€ 버전 κ³ μ • ν•„μš”
pytestκ°€μƒν™˜κ²½ μ•ˆν…ŒμŠ€νŠΈ λŒ€μƒ μ½”λ“œμ™€ 같은 ν™˜κ²½ ν•„μš”
jupyterκ°€μƒν™˜κ²½ μ•ˆμ»€λ„μ΄ ν”„λ‘œμ νŠΈ νŒ¨ν‚€μ§€λ₯Ό 봐야 함
pre-commitκΈ€λ‘œλ²Œ (pipx)μ—¬λŸ¬ ν”„λ‘œμ νŠΈ 곡톡
gitκΈ€λ‘œλ²Œ (μ‹œμŠ€ν…œ)λ‹Ήμ—°νžˆ μ „μ—­
uv, pyenvκΈ€λ‘œλ²Œ (μ‹œμŠ€ν…œ)ν™˜κ²½ 관리 도ꡬ 자체

핡심 원칙

"이 νŒ¨ν‚€μ§€κ°€ μ—†μœΌλ©΄ ν”„λ‘œμ νŠΈκ°€ μ•ˆ λŒμ•„κ°„λ‹€" β†’ κ°€μƒν™˜κ²½ μ•ˆ
"개발 머신이면 항상 μžˆμ–΄μ•Ό ν•œλ‹€"           β†’ κ°€μƒν™˜κ²½ λ°– (κΈ€λ‘œλ²Œ)

uv add λͺ…λ Ήμ–΄λŠ” pyproject.toml 파일이 μžˆμ–΄μ•Ό μž‘λ™ν•©λ‹ˆλ‹€. ν˜„μž¬ 디렉토리에 ν”„λ‘œμ νŠΈκ°€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ μƒνƒœμ˜ˆμš”.

ν•΄κ²° 방법:

# 1. uv ν”„λ‘œμ νŠΈ μ΄ˆκΈ°ν™” (pyproject.toml 생성)
uv init

# 2. κ·Έ λ‹€μŒ νŒ¨ν‚€μ§€ μΆ”κ°€
uv add django djangorestframework

λ˜λŠ” uv init 없이 λ°”λ‘œ ν•˜λ €λ©΄:

# pip λ°©μ‹μœΌλ‘œ 직접 μ„€μΉ˜
uv pip install django djangorestframework

두 λ°©λ²•μ˜ 차이:

λ°©λ²•νŠΉμ§•
uv init β†’ uv addpyproject.toml에 μ˜μ‘΄μ„± 기둝됨 (ꢌμž₯)
uv pip installκ°€μƒν™˜κ²½μ—λ§Œ μ„€μΉ˜, 기둝 μ—†μŒ

Django ν”„λ‘œμ νŠΈλ₯Ό μ œλŒ€λ‘œ κ΄€λ¦¬ν•˜λ €λ©΄ uv init ν›„ uv addλ₯Ό μ“°λŠ” 게 μ’‹μŠ΅λ‹ˆλ‹€. ν˜Ήμ‹œ ~/HY_leverage 폴더가 이미 Django ν”„λ‘œμ νŠΈ ꡬ쑰라면 pyproject.toml만 μ—†λŠ” 건지 ν™•μΈν•΄λ³Όκ²Œμš”:

ls ~/HY_leverage

κ²°κ³Όλ₯Ό λ³΄μ—¬μ£Όμ‹œλ©΄ 상황에 맞게 μ•ˆλ‚΄ν•΄λ“œλ¦΄κ²Œμš”!

script.py 파일이 μ‘΄μž¬ν•˜μ§€ μ•Šμ•„μ„œ μƒκΈ°λŠ” 였λ₯˜μ˜ˆμš”! νŒŒμΌμ„ λ¨Όμ € λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.

# script.py 파일 생성
touch script.py

# λ˜λŠ” λ‚΄μš©κ³Ό ν•¨κ»˜ λ°”λ‘œ 생성
echo "print('hello')" > script.py

# κ·Έ λ‹€μŒ μ‹€ν–‰
uv run python script.py

ν˜Ήμ‹œ 파일 이름이 λ‹€λ₯Έ κ±° μ•„λ‹κΉŒμš”? ν˜„μž¬ 폴더에 뭐가 μžˆλŠ”μ§€ ν™•μΈν•΄λ³΄μ„Έμš”:

ls ~/HY_leverage
profile
κ°œλ°œμ–Έμ–΄λ₯Ό λ°°μš°λŠ” κ³Όμ • 기둝

0개의 λŒ“κΈ€