๊ฐœ์š”

mcp ๊ด€๋ จ ๊นƒํ—ˆ๋ธŒ๋ฅผ ๋Œ์•„๋‹ค๋‹ˆ๋‹ค ๋ณด๋ฉด ์ตœ์‹  python ํ”„๋กœ์ ํŠธ๋“ค์€ ๋Œ€๋ถ€๋ถ„ uv๋ฅผ ํ†ตํ•ด ์‹คํ–‰์ด๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒŒ๋ญ์ง€ ํ•ด์„œ ์•Œ์•„๋ดค๋Š”๋ฐ, ์‹คํ–‰ํ•  ๋•Œ ํ™˜๊ฒฝ์„ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๊ธฐ์— ์•ˆ์ „ํ•˜๊ณ  ํŽธํ•  ๋ฟ ์•„๋‹ˆ๋ผ ๋น ๋ฅด๊ธฐ๊นŒ์ง€ ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

๋ณธ๊ฒฉ์ ์œผ๋กœ ์•Œ์•„๋ณด์ž.

๊นƒํ—ˆ๋ธŒ ํŽ˜์ด์ง€์˜ ์„ค๋ช…์— ๋”ฐ๋ฅด๋ฉด

์—„์ฒญ๋‚˜๊ฒŒ ๋น ๋ฅธ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€ & ํ”„๋กœ์ ํŠธ ๋งค๋‹ˆ์ €

๋Ÿฌ์ŠคํŠธ๋กœ ์ž‘์„ฑ๋จ

Shows a bar chart with benchmark results.

highlights

    • ๐Ÿš€ pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv ๋“ฑ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ๋„๊ตฌ
    • โšก๏ธ pip๋ณด๋‹ค 10~100๋ฐฐ ๋น ๋ฆ„
    • ๐Ÿ—‚๏ธ ๋ฒ”์šฉ ๋ฝํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ํฌ๊ด„์ ์ธ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ์ œ๊ณต
    • โ‡๏ธ ์ธ๋ผ์ธ ์˜์กด์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ง€์›
    • ๐Ÿ Python ๋ฒ„์ „ ์„ค์น˜ ๋ฐ ๊ด€๋ฆฌ
    • ๐Ÿ› ๏ธ Python ํŒจํ‚ค์ง€๋กœ ๋ฐฐํฌ๋œ ๋„๊ตฌ ์‹คํ–‰ ๋ฐ ์„ค์น˜
    • ๐Ÿ”ฉ ์ต์ˆ™ํ•œ CLI๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ๋œ pip ํ˜ธํ™˜ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
    • ๐Ÿข ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ Cargo ์Šคํƒ€์ผ์˜ ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ง€์›
    • ๐Ÿ’พ ์˜์กด์„ฑ ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ์œ„ํ•œ ๊ธ€๋กœ๋ฒŒ ์บ์‹œ๋กœ ๋””์Šคํฌ ๊ณต๊ฐ„ ํšจ์œจ์  ์‚ฌ์šฉ
    • โฌ Rust๋‚˜ Python ์—†์ด๋„ curl ๋˜๋Š” pip๋กœ ์„ค์น˜ ๊ฐ€๋Šฅ
    • ๐Ÿ–ฅ๏ธ macOS, Linux, Windows ์ง€์›

ํ‘œ์‹œํ•œ ๊ฒƒ๋“ค๋งŒ ๋‘˜๋Ÿฌ๋ณด๋„๋ก ํ•˜์ž.

์„ค์น˜

10 โฌ Rust๋‚˜ Python ์—†์ด๋„ curl ๋˜๋Š” pip๋กœ ์„ค์น˜ ๊ฐ€๋Šฅ

# On macOS and Linux.
curl -LsSf https://astral.sh/uv/install.sh | sh
# On Windows.
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

ํ˜น์€

pip install uv

ํ„ฐ๋ฏธ๋„์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์ด pip๋ฅผ ํ†ตํ•ด ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ƒˆ์‚ผ์Šค๋Ÿฝ์ง€๋งŒ ํŽธ๋ฆฌํ•˜๋‹ค.

ํŒŒ์ด์ฌ ๋ฒ„์ „ ์„ค์น˜ ๋ฐ ๊ด€๋ฆฌ

1 ๐Ÿš€ pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv ๋“ฑ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ๋„๊ตฌ

5 ๐Ÿ Python ๋ฒ„์ „ ์„ค์น˜ ๋ฐ ๊ด€๋ฆฌ

6 ๐Ÿ› ๏ธ Python ํŒจํ‚ค์ง€๋กœ ๋ฐฐํฌ๋œ ๋„๊ตฌ ์‹คํ–‰ ๋ฐ ์„ค์น˜

$ uv python install 3.10 3.11 3.12
Searching for Python versions matching: Python 3.10
Searching for Python versions matching: Python 3.11
Searching for Python versions matching: Python 3.12
Installed 3 versions in 3.42s
 + cpython-3.10.14-macos-aarch64-none
 + cpython-3.11.9-macos-aarch64-none
 + cpython-3.12.4-macos-aarch64-none

ํŒŒ์ด์ฌ ์„ค์น˜ [๋ฒ„์ „] [๋ฒ„์ „] ... ๊ณผ ๊ฐ™์ด ์จ์„œ, ํŒŒ์ด์ฌ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

node์—์„œ npm์˜ ์—ญํ• ์„ uv์—์„œ๋„ ๊ฐ€์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

$ uv venv --python 3.12.0
Using Python 3.12.0
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate
 
$ uv run --python pypy@3.8 -- python --version
Python 3.8.16 (a9dbdca6fc3286b0addd2240f11d97d8e8de187a, Dec 29 2022, 11:45:30)
[PyPy 7.3.11 with GCC Apple LLVM 13.1.6 (clang-1316.0.21.2.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>>

๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด [ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ฒ„์ „ ์ง€์ •]์œผ๋กœ ๊ฐ„๋‹จํžˆ ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

CPython, Pypy๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋Ÿฐํƒ€์ž„๋„ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„์ „์ง€์ •์ด ์—†๋‹ค๋ฉด ๊ธฐ๋ณธ์„ค์ •์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.

$ uv python pin 3.11
Pinned `.python-version` to `3.11`

ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ด์ฌ ๋ฒ„์ „์„ ์ง€์ •ํ•ด ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

์†๋„

2 โšก๏ธ pip๋ณด๋‹ค 10~100๋ฐฐ ๋น ๋ฆ„

์‹คํ—˜ํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ streamlit์ด๋ผ๋Š” ์„ค์น˜์— ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค.

  1. ๊ฐ€์ƒํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๊ณ 
  2. ๋‚ด๋ถ€์— streamlit์„ ์„ค์น˜ํ•˜๊ณ 
  3. ์‹œ๊ฐ„์„ ์ธก์ •ํ•ด์ฃผ๋Š”

ํŒŒ์ผ์„ ๋งŒ๋“ค์ž. pip ๋ฒ„์ „๊ณผ uv๋ฒ„์ „์œผ๋กœ.

# pip.sh
#!/bin/bash
 
echo "๐Ÿ Python virtual environment ์ƒ์„ฑ ์‹œ์ž‘..."
START_TIME=$(date +%s)
 
# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ
python3 -m venv .venv
source .venv/bin/activate
 
echo "๐Ÿ“ฆ streamlit ์„ค์น˜ ์ค‘..."
pip3 install --upgrade pip >/dev/null
pip3 install streamlit
 
END_TIME=$(date +%s)
ELAPSED_TIME=$((END_TIME - START_TIME))
 
echo "โœ… streamlit ์„ค์น˜ ์™„๋ฃŒ!"
echo "โฑ๏ธ ์†Œ์š” ์‹œ๊ฐ„: ${ELAPSED_TIME}์ดˆ"
 
# ๊ฐ€์ƒํ™˜๊ฒฝ ๋น„ํ™œ์„ฑํ™” ๋ฐ ์‚ญ์ œ
deactivate
rm -rf .venv
echo "๐Ÿงน ๊ฐ€์ƒํ™˜๊ฒฝ(.venv) ์‚ญ์ œ ์™„๋ฃŒ"
#uv.sh
#!/bin/bash
 
echo "๐Ÿš€ uv๋ฅผ ์ด์šฉํ•œ streamlit ์„ค์น˜ ์‹œ์ž‘!"
START_TIME=$(date +%s)
 
# uv๋กœ venv ์ƒ์„ฑ
uv venv --python 3.12.0
 
# ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™”
source .venv/bin/activate
 
# streamlit ์„ค์น˜
echo "๐Ÿ“ฆ streamlit ์„ค์น˜ ์ค‘..."
uv pip install streamlit
 
END_TIME=$(date +%s)
ELAPSED_TIME=$((END_TIME - START_TIME))
 
echo "โœ… streamlit ์„ค์น˜ ์™„๋ฃŒ!"
echo "โฑ๏ธ ์†Œ์š” ์‹œ๊ฐ„: ${ELAPSED_TIME}์ดˆ"
 
# ๊ฐ€์ƒํ™˜๊ฒฝ ๋น„ํ™œ์„ฑํ™” ๋ฐ ์‚ญ์ œ
deactivate
rm -rf .venv
echo "๐Ÿงน ๊ฐ€์ƒํ™˜๊ฒฝ(.venv) ์‚ญ์ œ ์™„๋ฃŒ"

pip.sh ๊ฒฐ๊ณผ

uv.sh ๊ฒฐ๊ณผ

์˜๊ฒฌ

๋‚ด ํ™˜๊ฒฝ(macbook m1 pro)์—์„œ ์ƒ๊ฐ๋ณด๋‹ค ํฐ์ฐจ์ด๊ฐ€ ์•ˆ๋‚˜๋‚˜? ์‹ถ์ง€๋งŒ ๊ทธ๊ฒƒ๋ณด๋‹ค๋Š” ์ค€๋น„ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ ธ๊ณ , ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์—๋Š” ๋” ํฐ ์ฐจ์ด๊ฐ€ ๋‚ฌ๋‹ค.

์ค€๋น„ํ•˜๋Š” ๋ฐ 2์ดˆ๋‚˜ ๊ฑธ๋ ธ๋‹ค.

ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ • & ์‹คํ–‰

3 ๐Ÿ—‚๏ธ ๋ฒ”์šฉ ๋ฝํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ํฌ๊ด„์ ์ธ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ์ œ๊ณต

8 ๐Ÿข ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ Cargo ์Šคํƒ€์ผ์˜ ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ง€์›

ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด์™€ ์‹คํ–‰์‹œ ์ƒ์„ฑ๋˜๋Š” ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

โฏ uv init
Initialized project `uv` # ํ˜„์žฌ ํด๋”๋ช…์œผ๋กœ ๊ธฐ๋ณธ ์ƒ์„ฑ
 
โฏ uv init mytest
Initialized project `mytest` at `๊ฒฝ๋กœ` # ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚ด๋ถ€์— ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
 
โฏ cd mytest
โฏ ls -a
.git            .python-version main.py         pyproject.toml  README.md

์ด ์ค‘ toml ํŒŒ์ผ์€ ์ฒ˜์Œ๋ณด๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

Rust๋Š” ์ด๋Ÿฐ ํŒŒ์ผ์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ํŒŒ์ด์ฌ์—์„œ๋„ ๋น„์Šทํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ํŒŒ์ผ์ด๋‹ค.

# pyproject.toml
[project]
name = "mytest"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []

dependencies์—๋Š” ๋‚ด๊ฐ€ ์„ค์น˜ํ•œ ์˜์กด์„ฑ๋“ค์ด ์ €์žฅ๋œ๋‹ค.

์˜์กด์„ฑ

์˜์กด์„ฑ๋“ค์ด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๊ฐ€ ๋˜๋Š” ์ง€ ํ™•์ธํ•ด๋ณด์ž.

โฏ uv add streamlit
Using CPython 3.12.0
Creating virtual environment at: .venv
Resolved 39 packages in 202ms
Prepared 36 packages in 2.92s
Installed 36 packages in 90ms
 
โฏ ls -a
.               .python-version main.py         README.md
..              .venv           pyproject.toml  uv.lock
# pyproject.toml
[project]
... # ์ƒ๋žต
requires-python = ">=3.12"
dependencies = [
    "streamlit>=1.44.1",
]

์ •๋ฆฌํ•ด๋ณด์ž. uv๋กœ ํ”„๋กœ์ ํŠธ์— streamlit์„ ๋”ํ–ˆ์„ ๋ฟ์ธ๋ฐโ€ฆ

  1. venv ์„ค์ •์ด ๋˜์—ˆ๋‹ค.
  2. uv.lock ํŒŒ์ผ์ด ์ƒ๊ฒผ๋‹ค. (yarn.lock ๋“ฑ์˜ ํŒŒ์ผ๊ณผ ๋น„์Šทํ•˜๊ฒŒ, ๊ฐ•๋ ฅํ•œ ์˜์กด์„ฑ ๊ธฐ๋ก ํŒŒ์ผ)
  3. toml ํŒŒ์ผ์—๋„ ์˜์กด์„ฑ์ด ์ €์žฅ๋˜์—ˆ๋‹ค.

๊ณต์œ ํ•œ ํŒŒ์ผ์„ uv ํ‘œ์ค€๋Œ€๋กœ ์‹คํ–‰๋งŒ ํ•˜๋ฉด ์ •๋ง ์ตœ๋Œ€ํ•œ ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์ง€์šฐ๊ณ ์‹ถ์€ ๊ฒƒ์€ uv remove [์˜์กด์„ฑ]์„ ํ†ตํ•ด ๊ฐ€๋Šฅํ•˜๋‹ค

ํ”„๋กœ์ ํŠธ ํŒŒ์ด์ฌ ๋ฒ„์ „

์ด ๋˜ํ•œ ๋‹น์—ฐํžˆ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. .python-version ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์›ํ•˜๋Š” ๋ฒ„์ „์œผ๋กœ ๋ฐ”๊พผ๋‹ค.
  2. pyproject.tomlํŒŒ์ผ์˜ requires-python = ">=[๋ฒ„์ „]" ๋ฒ„์ „ ๋ถ€๋ถ„์„ ์›ํ•˜๋Š” ๋ฒ„์ „์œผ๋กœ ๋ฐ”๊พผ๋‹ค.
โฏ uv run main.py
Using CPython 3.11.12
Removed virtual environment at: .venv
Creating virtual environment at: .venv
Hello from mytest!

๋ฐ”๋€ ๋ฒ„์ „์— ๋งž๋Š” venv๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ถ€๋ถ„์ด ํ‚ฅ์ด๋‹ค.

ํ›„๊ธฐ

  • ๋„ˆ๋ฌด ์ž˜ ์“ธ๊ฒƒ ๊ฐ™์€ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž & ํŒŒ์ด์ฌ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋‹ค.
    • ์ด๋ฏธ ๋งŽ์€ mcp๋ฅผ ๋น„๋กฏํ•œ ํŒŒ์ด์ฌ ํ”„๋กœ์ ํŠธ์— ๊ฐœ๋ฐœ์ž๋“ค์ด ์ ๊ทน ํ™œ์šฉํ•˜๊ณ  ์žˆ๊ณ , ๊ทธ ์ด์œ ๋ฅผ ์•Œ ๊ฒƒ ๊ฐ™๋‹ค.
    • ๋‹ค๋ฃจ์ง€ ์•Š์•˜์ง€๋งŒ, mcp์—์„œ ์Šคํฌ๋ฆฝํŠธ ๋“ฑ์„ ๋„ฃ์„ ๋•Œ, ์–ด๋–ค ํŒŒ์ด์ฌ์„ ์“ธ ์ง€ ๋“ฑ์˜ ๊ฒฝ๋กœ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•ด์ค€๋‹ค๊ณ  ํ•œ๋‹ค.
    • ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ๋น ๋ฅด๋‹ค. ๋‹จ์ ์ด ์—†๋‹ค. ๊ตณ์ด๊ตณ์ด ๊ผฝ์ž๋ฉด ์ƒˆ๋กœ์šด ์‚ฌ์šฉ ์ปค๋งจ๋“œ?
  • pycharm๊ฐ™์€ ์ข‹์€ ide๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, .venv๋“ฑ์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋Ÿฐ ๊ณผ์ •์„ ๋ชจ๋‘ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š”๊ฒŒ, ์ง„์งœ ๊ดœ์ฐฎ์€ ide ์ •๋„์˜ ๊ฐ€์น˜๋ฅผ ๊ฐ€์งˆ์ˆ˜๋„ ์žˆ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค.
  • ๋‹น์žฅ 0.์—˜๋ผ์Šคํ‹ฑ ํ”„๋กœ์ ํŠธ ๊ฐœ์š” ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜์ž๊ณ  ์ œ์•ˆํ–ˆ๋‹ค.
    • ๋‹ค๋งŒ ์ œ๋Œ€๋กœ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ณ  ๋‚˜๋‹ˆ, ํ”„๋กœ์ ํŠธ ์‹œ์ž‘, ํ™˜๊ฒฝ์„ค์ •, ๊ณต์œ  ๋“ฑ์— ์žฅ์ ์„ ๊ฐ€์ง€๊ธฐ์— ์žฅ๊ธฐ๊ฐ„ ํ”„๋กœ์ ํŠธ์—๋Š” ๋”ฑํžˆ ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค๊ธดํ•œ๋‹ค.