๊ฐ์ํ๊ฒฝ์ด๋?
๊ฐ์ํ๊ฒฝ(Virtual Environment)์ Python ํ๋ก์ ํธ๋ฅผ ์ํ ๋ ๋ฆฝ๋ ๊ณต๊ฐ์ ๋ง๋๋ ๊ธฐ์ ์ ๋๋ค. ๊ฐ ํ๋ก์ ํธ๊ฐ ์๋ก ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ํจํค์ง๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค.
๊ฐ์ํ๊ฒฝ์ ํ์์ฑ
์ปดํจํฐ(์ง)
โโโ ์์คํ
Python(๊ฑฐ์ค) - ๋ชจ๋ ์ฌ๋์ด ๊ณต์
โโโ ํ๋ก์ ํธA ๊ฐ์ํ๊ฒฝ(A์ ๋ฐฉ) - A ์ ์ฉ ํจํค์ง
โโโ ํ๋ก์ ํธB ๊ฐ์ํ๊ฒฝ(B์ ๋ฐฉ) - B ์ ์ฉ ํจํค์ง
์์คํ ์ ์ฒด ์ค์น vs ๊ฐ์ํ๊ฒฝ
๊ตฌ๋ถ ์์คํ ์ ์ฒด ์ค์น ๊ฐ์ํ๊ฒฝ ์ฌ์ฉ
| ์ค์น ์์น | ์์คํ Python์ ๋ชจ๋ ํจํค์ง ์ค์น | ๊ฐ ํ๋ก์ ํธ๋ณ ๋ ๋ฆฝ๋ ํ๊ฒฝ |
| ํจํค์ง ๋ฒ์ | ๋ชจ๋ ํ๋ก์ ํธ๊ฐ ๊ฐ์ ๋ฒ์ ๊ณต์ | ํ๋ก์ ํธ๋ณ ๋ค๋ฅธ ๋ฒ์ ์ฌ์ฉ ๊ฐ๋ฅ |
| ์ถฉ๋ ์ํ | ๋์ (๋ฒ์ ์ถฉ๋ ๋ฐ์ ๊ฐ๋ฅ) | ๋ฎ์ (์์ ํ ๊ฒฉ๋ฆฌ๋จ) |
| ์์ ์ฑ | ์์คํ Python ๋ณ๊ฒฝ์ผ๋ก ์ํ | ์์คํ ์ ์ํฅ ์์ |
๊ฐ์ํ๊ฒฝ์ ์ฅ์
- ๋ ๋ฆฝ์ฑ: ๊ฐ ํ๋ก์ ํธ๊ฐ ํ์ํ ํจํค์ง๋ง ์ค์น
- ์์ ์ฑ: ์์คํ Python์ ๊ฑด๋๋ฆฌ์ง ์์ ์์ ์ฑ ์ ์ง
- ์ถฉ๋ ๋ฐฉ์ง: ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ ํจํค์ง ์ถฉ๋ ๋ฐฉ์ง
- ์ด์์ฑ: ํ๋ก์ ํธ ์ด๋ ์ ์์กด์ฑ ๊ด๋ฆฌ ์ฉ์ด
externally-managed-environment ์ค๋ฅ ๋ถ์
์ค๋ฅ ๋ฐ์ ์์ธ
macOS์์ Homebrew๋ก ์ค์น๋ Python์ PEP 668 ์ ์ฑ ์ ๋ฐ๋ผ ์์คํ ํจํค์ง ๊ด๋ฆฌ์(Homebrew)์์ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ง์ ์ ์ธ pip ์ค์น๋ฅผ ์ ํํฉ๋๋ค.
pip install uv
# error: externally-managed-environment
# × This environment is externally managed
์ค๋ฅ ๋ฉ์์ง ํด์
์ค๋ฅ ๋ฉ์์ง์์ ์ ๊ณตํ๋ ํด๊ฒฐ์ฑ ๋ค:
- Homebrew ์ฌ์ฉ: brew install xyz
- ๊ฐ์ํ๊ฒฝ ์ฌ์ฉ: python3 -m venv path/to/venv
- pipx ์ฌ์ฉ: brew install pipx
- ์์คํ ํจํค์ง ์ ํ ํด์ : --break-system-packages (๊ถ์ฅํ์ง ์์)
ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฐฉ๋ฒ 1: pipx ์ฌ์ฉ (์ถ์ฒ)
pipx๋ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ํ๊ฒฝ์ ์๋์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
# pipx ์ค์น
brew install pipx
# uv ์ค์น
pipx install uv
# ์ค์น ํ์ธ
uv --version
์ค์น ์์น:
# pipx ๊ฐ์ํ๊ฒฝ ์์น
~/.local/share/pipx/venvs/uv/
# ์คํ ํ์ผ ์ฌ๋ณผ๋ฆญ ๋งํฌ
~/.local/bin/uv
# pipx๋ก ์ค์น๋ ๋ชจ๋ ์ฑ ํ์ธ
pipx list
์ฅ์ :
- ์๋์ผ๋ก ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ๊ด๋ฆฌ
- ๊ธ๋ก๋ฒํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ช ๋ น์ด
- ์์คํ Python๊ณผ ๊ฒฉ๋ฆฌ
๋ฐฉ๋ฒ 2: ๊ฐ์ํ๊ฒฝ ์์ฑ ํ ์ค์น
# ๊ฐ์ํ๊ฒฝ ์์ฑ
python3 -m venv myproject-env
# ๊ฐ์ํ๊ฒฝ ํ์ฑํ
source myproject-env/bin/activate
# uv ์ค์น
pip install uv
# ๊ฐ์ํ๊ฒฝ ๋นํ์ฑํ
deactivate
์ค์น ์์น:
# ๊ฐ์ํ๊ฒฝ ์ ์ฒด ๊ตฌ์กฐ
myproject-env/
โโโ bin/ # ์คํ ํ์ผ๋ค
โ โโโ python -> python3 # Python ์ธํฐํ๋ฆฌํฐ
โ โโโ pip # pip
โ โโโ uv # ์ค์น๋ uv
โโโ include/ # ํค๋ ํ์ผ
โโโ lib/
โ โโโ python3.x/
โ โโโ site-packages/ # ์ค์น๋ ํจํค์ง๋ค
โ โโโ uv/ # uv ํจํค์ง
โโโ pyvenv.cfg # ๊ฐ์ํ๊ฒฝ ์ค์
# ํ์ธ ๋ช
๋ น์ด
which python # myproject-env/bin/python
which pip # myproject-env/bin/pip
which uv # myproject-env/bin/uv
๋ฐฉ๋ฒ 3: Homebrew ์ง์ ์ค์น
# Homebrew๋ก uv ์ค์น (๊ฐ๋ฅํ ๊ฒฝ์ฐ)
brew install uv
์ค์น ์์น:
# Apple Silicon Mac (M1/M2/M3)
/opt/homebrew/bin/uv
/opt/homebrew/Cellar/uv/[๋ฒ์ ]/
# Intel Mac
/usr/local/bin/uv
/usr/local/Cellar/uv/[๋ฒ์ ]/
# ํ์ธ ๋ช
๋ น์ด
which uv # /opt/homebrew/bin/uv
brew list uv # ์ค์น๋ ํ์ผ ๋ชฉ๋ก
brew info uv # ์์ธ ์ ๋ณด
๋ฐฉ๋ฒ 4: ์์คํ ์ ํ ํด์ (๋น์ถ์ฒ)
# ์์์ ํด์
pip install uv --break-system-packages
# ๋๋ ์ฌ์ฉ์ ๋๋ ํ ๋ฆฌ์ ์ค์น
pip install uv --user
์ค์น ์์น:
# --break-system-packages ์ฌ์ฉ ์
# Homebrew Python์ site-packages
/opt/homebrew/lib/python3.x/site-packages/uv/
# --user ์ฌ์ฉ ์
# ์ฌ์ฉ์ ๋ก์ปฌ ๋๋ ํ ๋ฆฌ
~/.local/lib/python3.x/site-packages/uv/
~/.local/bin/uv
# ํ์ธ ๋ช
๋ น์ด
python3 -m site --user-site # ์ฌ์ฉ์ site-packages ์์น
pip show uv # ํจํค์ง ์ค์น ์ ๋ณด
์ฃผ์: ์ด ๋ฐฉ๋ฒ์ ์์คํ ์์ ์ฑ์ ํด์น ์ ์์ผ๋ฏ๋ก ๊ถ์ฅํ์ง ์์ต๋๋ค.
- Homebrew๋ก ์ค์นํ ๊ฒฝ์ฐ
- ์ค์น ์์น: /usr/local/Cellar/ (์์คํ ๋ ๋ฒจ)
- ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ
- PATH์ ์๋์ผ๋ก ์ถ๊ฐ๋จ
- ์์คํ ์ ์ฒด์์ ์ฌ์ฉ ๊ฐ๋ฅ
- ์: brew install python → /usr/local/Cellar/python/3.x.x/
- ๊ฐ์ํ๊ฒฝ(venv)์ผ๋ก ์ค์นํ ๊ฒฝ์ฐ
- ์ค์น ์์น: ํ๋ก์ ํธ ํด๋ ๋ด (์: test-server/venv/)
- ํด๋น ํ๋ก์ ํธ์์๋ง ์ฌ์ฉ
- ํ๋ก์ ํธ๋ณ๋ก ๋ ๋ฆฝ๋ ํ๊ฒฝ ์ ๊ณต
- ํ์ฑํ/๋นํ์ฑํ ํ์ (source venv/bin/activate)
- ๋ค๋ฅธ ํ๋ก์ ํธ์ ์ํฅ ์ฃผ์ง ์์
- pipx๋ก ์ค์นํ ๊ฒฝ์ฐ
- ์ค์น ์์น: ~/.local/pipx/venvs/ (์ฌ์ฉ์ ํ ๋๋ ํ ๋ฆฌ)
- ๊ฐ ํจํค์ง๋ณ๋ก ๋ ๋ฆฝ๋ ๊ฐ์ํ๊ฒฝ ์๋ ์์ฑ
- ์คํ ํ์ผ์ ~/.local/bin/์ ์์ฑ
- ๊ธ๋ก๋ฒํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง ๊ฐ๊ฐ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ
- ์ฃผ๋ก CLI ๋๊ตฌ ์ค์น์ ์ฌ์ฉ
# Homebrew ์ค์น
brew install python # → /usr/local/bin/python3
# ๊ฐ์ํ๊ฒฝ ์ค์น
python3 -m venv test-server/venv # → test-server/venv/bin/python
# pipx ์ค์น
pipx install black # → ~/.local/pipx/venvs/black/bin/black
์ฃผ์ ์ฐจ์ด์ :
- Homebrew: ์์คํ ์ ์ฒด์์ ์ฌ์ฉํ ๋๊ตฌ ์ค์น
- ๊ฐ์ํ๊ฒฝ: ํ๋ก์ ํธ๋ณ Python ํจํค์ง ๊ด๋ฆฌ
- pipx: Python์ผ๋ก ์์ฑ๋ ๋ ๋ฆฝ์ ์ธ ๋๊ตฌ ์ค์น
์ฌ์ฉ ์ถ์ฒ:
- ๊ฐ๋ฐ ํ๋ก์ ํธ๋ฅผ ํ ๋๋ → ๊ฐ์ํ๊ฒฝ ์ฌ์ฉ
- Python์ผ๋ก ์์ฑ๋ ๋๊ตฌ๋ฅผ ์ค์นํ ๋๋ → pipx ์ฌ์ฉ
- ์์คํ ๋๊ตฌ๋ฅผ ์ค์นํ ๋๋ → Homebrew ์ฌ์ฉ
Homebrew์ pip์ ์ฃผ์ ์ฐจ์ด์ ์ ์ค๋ช ํด๋๋ฆฌ๊ฒ ์ต๋๋ค:
- ์์กด์ฑ ๊ด๋ฆฌ ๋ฐฉ์
- Homebrew:
- Python ์ธ์ ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ๊น์ง ๊ด๋ฆฌ
- ์: ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ ๋ ํ์ํ C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจ๊ป ์ค์น
- OS ๋ ๋ฒจ์ ํจํค์ง ๋งค๋์
- pip:
- Python ํจํค์ง๋ง ๊ด๋ฆฌ
- ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ ์ง์ ์ค์นํด์ผ ํจ
- Python ์ ์ฉ ํจํค์ง ๋งค๋์
- ์ค์น ๊ณผ์
- Homebrew:
- ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ค์น (bottle์ด๋ผ๊ณ ๋ถ๋ฆ)
- ์ค์น๊ฐ ๋ ์์ ์ ์ด๊ณ ๋น ๋ฆ
- macOS์ ์ต์ ํ๋ ์ค์ ์ผ๋ก ์ปดํ์ผ๋จ
- pip:
- ์์ค์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ๋ก์ปฌ์์ ์ปดํ์ผ
- ์ปดํ์ผ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์
- ์์คํ ๋ณ ์ต์ ํ๊ฐ ์ ๋ ์ ์์
- ์ ๋ฐ์ดํธ์ ๋กค๋ฐฑ
- Homebrew:
- ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๋ ์๊ฒฉํจ
- ์ด์ ๋ฒ์ ์ผ๋ก ์ฝ๊ฒ ๋กค๋ฐฑ ๊ฐ๋ฅ
- ์์คํ ์ ์ฒด์ ์ผ๊ด์ฑ ์ ์ง
- pip:
- ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๋ ์๊ฒฉํจ
- ๋กค๋ฐฑ์ด ์๋์ ์ผ๋ก ์ด๋ ค์
- ํจํค์ง ๊ฐ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์
์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค:
# OpenCV ์ค์น ์
brew install opencv
# → opencv ๋ฟ๋ง ์๋๋ผ ํ์ํ ๋ชจ๋ ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(numpy, ffmpeg ๋ฑ)๋ ํจ๊ป ์ค์น
pip install opencv-python
# → Python ํจํค์ง๋ง ์ค์น๋๊ณ , ํ์ํ ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ณ๋๋ก ์ค์นํด์ผ ํจ
๊ฒฐ๋ก ์ ์ผ๋ก:
- Homebrew๋ ์์คํ ์์ค์ ํจํค์ง ๋งค๋์ ๋ก, ๋ ์์ ์ ์ด๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์
- pip๋ Python ์ํ๊ณ์ ํนํ๋ ํจํค์ง ๋งค๋์
- ๊ฐ๋ฅํ๋ฉด ์์คํ ๋๊ตฌ๋ Homebrew๋ก, Python ๊ฐ๋ฐ์ฉ ํจํค์ง๋ ๊ฐ์ํ๊ฒฝ ๋ด์์ pip๋ก ์ค์นํ๋ ๊ฒ์ด ๊ถ์ฅ๋จ
์ด๊ฒ์ด Homebrew๊ฐ ๊ถ์ฅ๋๋ ์ด์ ์ ๋๋ค. ์์คํ ์ ์์ ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ ์ ์ ์งํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ค์น ์์น ์ข ํฉ ๋น๊ต
์ค์น ๋ฐฉ๋ฒ ์คํ ํ์ผ ์์น ํจํค์ง ์์น ์ ์ญ ์ฌ์ฉ ๊ฒฉ๋ฆฌ์ฑ
| pipx | ~/.local/bin/uv | ~/.local/share/pipx/venvs/uv/ | โ | โ |
| ๊ฐ์ํ๊ฒฝ | ./venv/bin/uv | ./venv/lib/python3.x/site-packages/ | โ | โ |
| Homebrew | /opt/homebrew/bin/uv | /opt/homebrew/Cellar/uv/ | โ | โ |
| --user | ~/.local/bin/uv | ~/.local/lib/python3.x/site-packages/ | โ | โ |
| --break-system | /opt/homebrew/bin/uv | /opt/homebrew/lib/python3.x/site-packages/ | โ | โ |
์ค์ ์ฌ์ฉ ์์
uv๋ฅผ ์ฌ์ฉํ ํ๋ก์ ํธ ๊ด๋ฆฌ
# ์ ํ๋ก์ ํธ ์์ฑ
uv init my-project
cd my-project
# ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํจํค์ง ์ค์น
uv add fastapi
uv add uvicorn
# ํ๋ก์ ํธ ์คํ
uv run main.py
์ ํต์ ์ธ ๋ฐฉ๋ฒ๊ณผ ๋น๊ต
# ์ ํต์ ์ธ ๋ฐฉ๋ฒ
python -m venv venv
source venv/bin/activate
pip install fastapi uvicorn
python main.py
deactivate
# uv ์ฌ์ฉ
uv add fastapi uvicorn
uv run main.py
๊ฐ์ํ๊ฒฝ ๊ด๋ฆฌ ํ
1. ํ๋ก์ ํธ๋ณ ๊ฐ์ํ๊ฒฝ ๋ช ๋ช
# ํ๋ก์ ํธ๋ช
ํฌํจ
python3 -m venv myapp-venv
python3 -m venv blog-project-venv
2. requirements.txt ํ์ฉ
# ํ์ฌ ํจํค์ง ๋ชฉ๋ก ์ ์ฅ
pip freeze > requirements.txt
# ๋ค๋ฅธ ํ๊ฒฝ์์ ๋ณต์
pip install -r requirements.txt
3. .gitignore ์ค์
# Python ๊ฐ์ํ๊ฒฝ
venv/
env/
myproject-env/
*.pyc
__pycache__/
๊ถ์ฅ์ฌํญ
- ๊ฐ๋ฐ ๋๊ตฌ๋ pipx๋ก: uv, black, flake8 ๋ฑ
- ํ๋ก์ ํธ ์์กด์ฑ์ ๊ฐ์ํ๊ฒฝ์ผ๋ก: ๊ฐ ํ๋ก์ ํธ๋ณ ํ๊ฒฝ ๋ถ๋ฆฌ
- ์์คํ Python ๋ณดํธ: --break-system-packages ์ฌ์ฉ ์ง์
- IDE ์ค์ : VS Code, PyCharm ๋ฑ์์ ๊ฐ์ํ๊ฒฝ ์ธํฐํ๋ฆฌํฐ ์ค์
๊ฒฐ๋ก
Python ๊ฐ๋ฐ์์ ๊ฐ์ํ๊ฒฝ์ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. externally-managed-environment ์ค๋ฅ๋ ์์คํ ์์ ์ฑ์ ์ํ ๋ณดํธ ์ฅ์น์ด๋ฉฐ, pipx๋ ๊ฐ์ํ๊ฒฝ์ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ฐ ๋ฐฉ๋ฒ์ ํน์ฑ์ ์ดํดํ๊ณ ํ๋ก์ ํธ ์ฑ๊ฒฉ์ ๋ง๋ ์ ์ ํ ํด๊ฒฐ์ฑ ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ฐ๋ฐ ๋๊ตฌ๋ pipx๋ก, ํ๋ก์ ํธ ์์กด์ฑ์ ๊ฐ์ํ๊ฒฝ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.