๐ฉโ๐ปPython ํ๊ฒฝ์ค์ ํ
ํ์ด์ฌ ํ๊ฒฝ ์ ํ ์ ๋์์ฃผ๋ venv, conda, mamba, uv ๋ค ๊ฐ์ง Python ๊ฐ์ํ๊ฒฝ/ํจํค์ง๊ด๋ฆฌ ๋ฐฉ์์ ๋ํด ๋น๊ต ์ ๋ฆฌ ๋ฐ ์ฅ๋จ์ ์ ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ด์ด์ ์ด๋ค ๊ฐ ์๋ก ์ ํ(Migration)ํ ์ ์๋ ๋ชจ๋ ์กฐํฉ(์ด 4ร3 = 12๊ฐ์ง ๋ฐฉํฅ ์ค ํ์ค์ ์ผ๋ก ์๋ฏธ ์๋ 6๊ฐ์ง ์ด์) ๊ฐ๊ฐ์ ๋ํด ๋จ๊ณ๋ณ ๊ฐ์ด๋๋ฅผ ์ ์ํฉ๋๋ค.
1. ๋น๊ต ์ ๋ฆฌ
๋น๊ตํ
| ๋ฐฉ์ | ์ฃผ์ ๊ธฐ๋ฅ/์ง์ ๋ฒ์ | ๊ฐ์ | ์ฝ์ |
|---|---|---|---|
| venv | Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฐ ๊ฐ์ํ๊ฒฝ ์์ฑ (python3 -m venv โฆ), ์ฃผ๋ก ์์ Python ํจํค์ง ์ค์ฌ |
์ค์น๊ฐ ๊ฐ๋จํ๊ณ ๋ณ๋ ๋๊ตฌ ์๊ฑฐ๋ ์ ์. ๊ฐ๋ณ๊ณ ๋น ๋ฆ | ๋ฐ์ด๋๋ฆฌ(C/C++ ํ์ฅ), OS-๋ ๋ฒจ ์์กด์ฑ, ์ฌ๋ฌ ์ธ์ด ํผํฉ ํ๊ฒฝ์ ํ๊ณ |
| conda | Anaconda/Miniconda ์ฒด๊ณ, ๊ฐ์ํ๊ฒฝ + ํจํค์ง๊ด๋ฆฌ + ๋ค์ํ ๋ฐ์ด๋๋ฆฌ/์ธ์ด/OS ์์กด์ฑ ์ค์น ๊ฐ๋ฅ | ๋ค์ํ ์ธ์ด/๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์, ๊ณผํ/๋จธ์ ๋ฌ๋ ์คํ์ ๊ฐ์ | ํ๊ฒฝ ์์ฑ/ํจํค์ง ์ค์น๊ฐ ๋๋ฆด ์ ์๊ณ ๋ณต์ก์ฑ ์์ |
| mamba | conda์ ๊ฑฐ์ ๋ช ๋ น์ด ํธํ๋๋, ์๋ ๋ฐ ์์กด์ฑ ํด๊ฒฐ ์๊ณ ๋ฆฌ์ฆ์ด ๊ฐ์ ๋ ๋๊ตฌ (โdrop-in replacementโ) | conda ๋๋น ๋น ๋ฅธ ์ค์น/ํด๊ฒฐ, ๋์ผ ์ธํฐํ์ด์ค๋ก ์ง์ ์ฅ๋ฒฝ ๋ฎ์ | ๋น๊ต์ ์ต์ ๋๊ตฌ๋ผ ์ผ๋ถ ์ํ๊ณ/๋ฒ๊ทธ ์ธก๋ฉด์์ ์์ ํ ๊ฒ์ฆ๋ ์ํ๋ ์๋ |
| uv | Astralโsh๊ฐ ๊ฐ๋ฐํ Rust ๊ธฐ๋ฐ Python ํ๋ก์ ํธ/ํจํค์ง๊ด๋ฆฌ ๋๊ตฌ. ๊ฐ์ํ๊ฒฝ ์์ฑ, Python ๋ฒ์ ๊ด๋ฆฌ, ํจํค์ง ์ค์น ๋ฐ ์คํ๊น์ง ํตํฉ๋จ. | ๋งค์ฐ ๋น ๋ฅธ ์์กด์ฑ ํด๊ฒฐ + Python ๋ฒ์ ์ค์น ์ง์ + ํ๋ก์ ํธ ๋จ์ ์ํฌํ๋ก์ฐ์ ์ ํฉ | ์์ง ์ผ๋ถ ์ํ๊ณ(๋ณต์กํ ๋ฐ์ด๋๋ฆฌ/OS ์์กด)์์๋ ์ ์ฝ์ด ์์ ์ ์๊ณ , ๊ธฐ์กด ์ํฌํ๋ก์ฐ์ ๋ง์ด๊ทธ๋ ์ด์ ๋น์ฉ ์์ |
์ฅ๋จ์ ์์ธ
venv
์ฅ์
- Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ ๊ณต๋๋ฏ๋ก ๋ณ๋ ์ค์น ๋ถ๋ด์ด ์ ์ต๋๋ค.
- ๊ฐ๋จํ ํ๋ก์ ํธ, ์์ Python ํจํค์ง๋ง ์ฐ๋ ๊ฒฝ์ฐ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ํ๊ฒฝ ์ธํ ๊ฐ๋ฅ.
- ํ๋ก์ ํธ ํด๋ ๋ด๋ถ์
.venvํํ๋ก ๊ด๋ฆฌํ๋ฉด ๊ตฌ์กฐ๊ฐ ์ง๊ด์ ์ ๋๋ค.
๋จ์
- ๋ฐ์ด๋๋ฆฌ(C/C++), OS-๋ ๋ฒจ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, GPU/์ฟ ๋ค ๋ฑ ๋ณต์กํ ์์กด์ฑ์ด ํ์ํ ๊ฒฝ์ฐ ์๋ ์ค์น๊ฐ ๋ง๊ณ ์ค๋ฅ ๊ฐ๋ฅ์ฑ ๋์.
- ์ฌ๋ฌ ํ๋ก์ ํธ์์ ๋ค์ํ Python ๋ฒ์ ์ ์ฐ๊ฑฐ๋ ๊ณต์ /๋ณต์ ํ๊ฒฝ์ ๋ง๋ค๋ ค๋ฉด ๋ณ๋ ๋๊ตฌ(pyenv ๋ฑ)๊ฐ ํ์ํ ์ ์์.
- ํจํค์ง ์ฌํ์ฑ(lockfile-๊ธฐ๋ฐ) ๋๋ ๋ํ ์คํ ๊ด๋ฆฌ์๋ ๊ธฐ๋ฅ์ด ์ ํ์ ์ผ ์ ์์ต๋๋ค.
conda
์ฅ์
- Python๋ฟ ์๋๋ผ R, C/C++, ๊ธฐํ ์ธ์ด ๋ฐ OS-๋ฐ์ด๋๋ฆฌ ์์กด์ฑ์ ํฌํจํ ํ๊ฒฝ ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ฐ์ดํฐ์ฌ์ด์ธ์ค/๋จธ์ ๋ฌ๋ ์ํ๊ณ์์ ํญ๋๊ฒ ์ฐ์ด๋ฉฐ ํจํค์ง ์ํ๊ณ/๋ฌธ์/์ง์์ด ํ๋ถํฉ๋๋ค.
- ํ๊ฒฝ ๊ฒฉ๋ฆฌ ๋ฐ ๋ณต์ (reproducibility)๋ฅผ ์ํ
environment.yml๋ฑ ๋ฐฉ์์ด ์กด์ฌํฉ๋๋ค.
๋จ์
- ํ๊ฒฝ ์์ฑ ๋ฐ ํจํค์ง ์ค์น ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์์ผ๋ฉฐ, ์์กด์ฑ ํด๊ฒฐ์ด ๋ณต์กํ ์ ์์ต๋๋ค.
- ์ ์ฅ์(channel) ์ค์ , ์ถฉ๋ ๋์, ํ๊ฒฝ๊ด๋ฆฌ ๋ฑ์ ์ถ๊ฐ ํ์ต์ด ํ์ํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฒผ์ด ํ๋ก์ ํธ๋ ์์ Python๋ง ์ฌ์ฉํ ๊ฒฝ์ฐ ๋๊ตฌ๊ฐ ๊ณผํ ์ ์๊ณ , ๋์คํฌ/๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋๊ฐ ์์ ์ ์์ต๋๋ค.
mamba
์ฅ์
- conda ๋ช ๋ น์ด ์ธํฐํ์ด์ค์ ๊ฑฐ์ ๋์ผํ๋ฏ๋ก ๊ธฐ์กด conda ์ฌ์ฉ์์๊ฒ ์ง์ ์ฅ๋ฒฝ์ด ๋ฎ์ต๋๋ค.
- ํนํ ์์กด์ฑ ํด๊ฒฐ ๋ฐ ํจํค์ง ์ค์น ์๋ ๋ฉด์์ ์ ๋ฆฌํ๋ค๋ ์ฌ๋ฌ ๋ณด๊ณ ๊ฐ ์์ต๋๋ค.
๋จ์
- ๋น๊ต์ ์ ์ ๋๊ตฌ์ด๋ฏ๋ก conda ๋๋น ์ํ๊ณ ์ง์์ด๋ ์์ ์ฑ ์ธก๋ฉด์์ ์์ง ์์ฑ๋๊ฐ ๋ฎ๋ค๋ ์๊ฒฌ๋ ์์ต๋๋ค.
- ์ผ๋ถ ์กฐ์ง/CI/CD ํ๊ฒฝ์์๋ conda๋ง ๊ณต์ ์ง์ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ด ์ ํ ์ ๊ณ ๋ ค์ฌํญ์ด ์์ต๋๋ค.
uv
์ฅ์
- ๋งค์ฐ ์ต์ ๋๊ตฌ๋ก, โ๊ฐ์ํ๊ฒฝ ์์ฑ + Python ๋ฒ์ ์ค์น + ํจํค์ง/์์กด์ฑ ๊ด๋ฆฌโ๋ฅผ ํ๋์ ์ํฌํ๋ก์ฐ๋ก ํตํฉํ๋ค๋ ๋น์ ์ด ์์ต๋๋ค.
- ์์กด์ฑ ํด๊ฒฐ ์๋๊ฐ ๋น ๋ฅด๋ฉฐ, ํ๋ก์ ํธ ๋จ์๋ก ์ฌํ ๊ฐ๋ฅํ ํ๊ฒฝ(lockfile ๊ธฐ๋ฐ ๋ฑ) ๊ตฌ์ฑ์ ์ ๋ฆฌํ๋ค๋ ํ๊ฐ๊ฐ ์์ต๋๋ค.
๋จ์
- ๋ณต์กํ ๋ฐ์ด๋๋ฆฌ/OS ์์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, GPU ์คํ ๋ฑ์์๋ ์์ง conda ๋๋น ์ ์ฝ์ด ์์ ์ ์๋ค๋ ์ฌ์ฉ์ ๊ฒฝํ์ด ์กด์ฌํฉ๋๋ค.
- ๊ธฐ์กด ์ํฌํ๋ก์ฐ๋ฅผ uv๋ก ๋ฐ๊พธ๋ ค๋ฉด ํ์ต/๋ง์ด๊ทธ๋ ์ด์ ๋น์ฉ์ด ์์ ์ ์๊ณ , ์ผ๋ถ ๋๊ตฌ์์ ํตํฉ์ด ์์ง ๋ฏธ์ฑ์ํ ์ ์์ต๋๋ค.
2. Migration
๋ค์์ผ๋ก ๋ค ๊ฐ์ง ๋ฐฉ์ ๊ฐ์ ๊ฐ๋ฅํ ์ ํ ์กฐํฉ์ ๋ชจ๋ ๊ณ ๋ คํด, ์ฃผ์ ์๋ฏธ ์๋ ์กฐํฉ์ ๋ํด ๋จ๊ณ๋ณ๋ก ์ด๋ป๊ฒ ์ด์ ํ ์ ์๋์ง ๊ฐ์ด๋๋ฅผ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ ํ ๊ฐ๋ฅํ ์ฃผ์ ์กฐํฉ(์ด 12๊ฐ์ง๊ฐ ๊ฐ๋ฅํ๋, ์ ์๋ฏธํ 8๊ฐ์ง ์ ๋๋ฅผ ์ฐ์ ์ ์):
- conda โ uv
- conda โ venv
- venv โ conda
- venv โ uv
- uv โ conda
- uv โ venv
- conda โ mamba
- mamba โ conda
- mamba โ uv
- venv โ mamba
- uv โ mamba
์กฐํฉ๋ณ ๋จ๊ณ ๊ฐ์ด๋
A) conda โ uv
conda ํ๊ฒฝ ํ์ฑํ:
Python ๋ฒ์ ํ์ธ ๋ฐ ํจํค์ง ๋ฆฌ์คํธ ์ถ์ถ:
uv ์ค์น (์์คํ ์ ์์ผ๋ฉด):
ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ ๋ฐ ์ด๊ธฐํ:
์ํ๋ Python ๋ฒ์ ์ค์น ํน์ ์ฌ์ฉ:
uv๋ก ๊ฐ์ํ๊ฒฝ ์์ฑ:
ํจํค์ง ์ค์น:
lockfile ์์ฑ ๋ฐ ๋๊ธฐํ:
์คํ/ํ ์คํธ:
(์ ํ) ๊ธฐ์กด conda ํ๊ฒฝ ์ ๋ฆฌ:
B) conda โ venv
conda ํ๊ฒฝ ํ์ฑํ:
ํจํค์ง ๋ฆฌ์คํธ ๋ฐ Python ๋ฒ์ ํ์ธ:
ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋:
venv ์์ฑ:
venv ํ์ฑํ:
ํจํค์ง ์ค์น:
ํ ์คํธ ์คํ:
(์ ํ) conda ํ๊ฒฝ ์ ๊ฑฐ:
C) venv โ conda
venv ํ์ฑํ:
Python ๋ฒ์ ๋ฐ ํจํค์ง ๋ฆฌ์คํธ ์ ์ฅ:
conda ์ค์น/์ค๋น (์ด๋ฏธ ์ค์น๋ผ ์๋ค๋ฉด ์๋ต)
์ conda ํ๊ฒฝ ์์ฑ:
๊ฐ๋ฅํ๋ฉด conda ํจํค์ง ์ค์น, ์ดํ pip ์ค์น:
ํ ์คํธ:
(์ ํ) venv ์ ๊ฑฐ:
D) venv โ uv
venv ํ์ฑํ:
ํจํค์ง ๋ฆฌ์คํธ ์ ์ฅ:
uv ์ค์น (์์คํ ์ ์์ผ๋ฉด):
ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ / ์ด๊ธฐํ:
Python ๋ฒ์ ์ค์น/์ฌ์ฉ:
๊ฐ์ํ๊ฒฝ ์์ฑ:
ํจํค์ง ์ค์น:
lockfile ์์ฑ ๋ฐ ๋๊ธฐํ:
ํ ์คํธ ์คํ:
(์ ํ) ๊ธฐ์กด venv ์ ๊ฑฐ:
E) uv โ conda
uv ํ๊ฒฝ์์ Python ๋ฒ์ ๋ฐ ํจํค์ง ๋ฆฌ์คํธ ์ถ์ถ:
conda ์ค์น/์ค๋น
์๋ก์ด conda ํ๊ฒฝ ์์ฑ:
ํจํค์ง ์ค์น:
ํ ์คํธ:
(์ ํ) uv ํ๊ฒฝ ๊ด๋ จ ํ์ผ ์ ๋ฆฌ (.venv, uv.lock ๋ฑ)
F) uv โ venv
uv ํ๊ฒฝ์์ ํจํค์ง ๋ฆฌ์คํธ ์ถ์ถ:
ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋:
venv ์์ฑ:
venv ํ์ฑํ:
ํจํค์ง ์ค์น:
ํ ์คํธ ์คํ:
(์ ํ) uv ํ๊ฒฝ ์ ๊ฑฐ/์ ๋ฆฌ
G) conda โ mamba
์์คํ ์ mamba ์ค์น:
๊ธฐ์กด conda ๋ช ๋ น์ด ๋๋ถ๋ถ์ mamba๋ก ๋ฐ๊พธ์ด ์คํ ๊ฐ๋ฅ:
ํ ์คํธ:
(์ ํ) ๊ธฐ์กด conda ๋ช ๋ น์ด ์ฐ๋ ์ต๊ด์ mamba๋ก ๊ต์ฒด
H) mamba โ conda
conda ์ค์น/์ค๋น (์ด๋ฏธ ๋๋ถ๋ถ ์ค์น๋์ด ์์)
mamba ํ๊ฒฝ์์ ํจํค์ง ๋ฆฌ์คํธ ์ถ์ถ:
์ conda ํ๊ฒฝ ์์ฑ:
ํจํค์ง ์ค์น:
ํ ์คํธ ์คํ:
I) mamba โ uv
mamba ํ๊ฒฝ ํ์ฑํ ๋ฐ ๋ฆฌ์คํธ ์ถ์ถ:
uv ์ค์น
ํ๋ก์ ํธ ์ด๊ธฐํ (
uv init)Python ๋ฒ์ ์ค์น (
uv python install 3.x)uv venv ์์ฑ (
uv venv --python 3.x)uv pip install from requirements file (
uv pip install -r requirements_mamba.txt)uv lock + sync
์คํ ํ ์คํธ (
uv run python your_script.py)
J) venv โ mamba
venv ํ์ฑํ
conda+mamba ์ค์น/์ค๋น
์ mamba ํ๊ฒฝ ์์ฑ:
ํจํค์ง ์ค์น:
ํ ์คํธ ์คํ:
K) uv โ mamba
uv ํ๊ฒฝ์์ ๋ฆฌ์คํธ ์ถ์ถ:
conda/mamba ์ค์น
์ mamba ํ๊ฒฝ ์์ฑ:
ํจํค์ง ์ค์น:
ํ ์คํธ ์คํ:
3. ์ ๋ฆฌ ๋ฐ ์ถ์ฒ
- ๊ฐ๋จํ๊ณ ์์ Python ํจํค์ง ์ค์ฌ์ด๋ผ๋ฉด
venv๋ฐฉ์์ด ์ต์ํ์ ์ค๋ฒํค๋๋ก ์ ํฉํฉ๋๋ค. - ๋ณต์กํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ/๋ฐ์ด๋๋ฆฌ/๊ณผํ/๋จธ์ ๋ฌ๋ ์คํ์ด ๋ง๋ค๋ฉด
conda๋๋mamba๋ฐฉ์์ด ์์ ์ ์ ๋๋ค. ํนํ ์ค์น/์์กด์ฑ ํด๊ฒฐ ์๋๊ฐ ์ค์ํ๋ค๋ฉดmamba๊ฐ ์ข์ ์ ํ์ ๋๋ค. - ์ต์ ์ํฌํ๋ก์ฐ, Python ๋ฒ์ ๊ด๋ฆฌ, ํ๋ก์ ํธ ๋จ์ ์ฌํ์ฑ(lockfile)์ง์์ด ์ค์ํ๊ณ , ๋ฐ์ด๋๋ฆฌ/OS ์์กด์ฑ์ด ๋ํ๋ค๋ฉด
uv๊ฐ ๋งค๋ ฅ์ ์ธ ์ ํ์ ๋๋ค. - ๋ง์ด๊ทธ๋ ์ด์ โ(ํ๊ฒฝ์ ๋ฐ๊พธ๋ ๊ฒ)๋ฅผ ๊ณ ๋ คํ ๋๋ โ์์ ํ ๋์ผํ ํ๊ฒฝ์ ๋ณต์ ํ๋คโ๋ณด๋ค๋ โ์ ์ฌํ๊ฒ ์ฌ๊ตฌ์ฑํ๋คโ๋ ๊ด์ ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ํ์ค์ ์ ๋๋ค.
4. Conda ํ๊ฒฝ ์ฎ๊ธฐ๊ธฐ
Conda ํ๊ฒฝ์ ์ต๋ํ ๊ทธ๋๋ก ๋ณต์ (์ด๋/๋ฐฑ์ /์ฌ์)ํ๋ ์ถ์ฒ ์ ์ฐจ๋ฅผ ์๋์ ์ ๋ฆฌํฉ๋๋ค. ๋ฒ์ ์ด๋ ๋ก์ปฌ ๊ฒฝ๋ก(p-prefix) ๋ฑ์ด ๊ผฌ์ฌ์ ์คํจํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก, ์ฃผ์์ฌํญ๊ณผ ์ฐํ ๋ฐฉ๋ฒ๊น์ง ํจ๊ป ํฌํจํ์์ต๋๋ค.
โ ๊ธฐ๋ณธ ์ ์ฐจ
1. ์๋ณธ ํ๊ฒฝ ํ์ฑํ
2. ํจํค์ง ๋ฆฌ์คํธ ๋ฐ ํ๊ฒฝ ์ ๋ณด ๋ด๋ณด๋ด๊ธฐ
# OS ๋
๋ฆฝ์ฑ์ ๋์ด๋ ค๋ฉด ๋น๋ ์ ๋ณด ์๋ต
conda env export --no-builds > environment.yml
# (์ ํ) pip๋ก ์ค์น๋ ํจํค์ง๊ฐ ์๋ค๋ฉด
pip freeze > pip_requirements.txt์ฃผ์:
environment.yml๋ด์prefix:ํญ๋ชฉ(์: ๋ก์ปฌ ๊ฒฝ๋ก)์ด ํฌํจ๋์ด ์์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ฒฝ๋ก/๋ค๋ฅธ ๋จธ์ ์ ๋ณต์ ํ ๋ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ฏ๋ก ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
3. ์ ํ๊ฒฝ ์์ฑ
๋๋
4. ๋์ ํ ์คํธ
ํ๋ก์ ํธ๊ฐ ์์๋๋ก ๋์ํ๋์ง ํ์ธํฉ๋๋ค.
5. (์ ํ) ์๋ณธ ํ๊ฒฝ ์ ๋ฆฌ
โ ๏ธ ์์ฃผ ๋ง์ฃผ์น๋ ๋ฌธ์ ๋ฐ ํด๊ฒฐ ํ
- prefix ๊ฒฝ๋ก ๋ฌธ์
environment.yml์์ ์๋ณธ ํ๊ฒฝ์ ์ ๋ ๊ฒฝ๋ก๊ฐprefix:๋ก ์ ์ฅ๋์ด ์์ ๊ฒฝ์ฐ, ๋ค๋ฅธ ๋จธ์ ๋๋ ๋ค๋ฅธ ์์น์์ ๊ทธ๋๋ก ๋ง๋ค๋ฉด ์ถฉ๋ํ๊ฑฐ๋ ๋ฌด์๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ([Stack Overflow][1])- โค ํด๊ฒฐ:
grep -v "^prefix:" environment.yml > clean_env.yml๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ฑฐ ํ ์ฌ์ฉ.
- ๋น๋ ๋ฒํธ/ํ๋ซํผ ์์กด์ฑ ๋ฌธ์
- ๋น๋ ๋ฒํธ(
=py38_0๋ฑ)๋ OS/์ํคํ ์ฒ ํน์ ํจํค์ง๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด, ๋ค๋ฅธ ์์คํ (์: Windows โ๏ธ Linux)์์ ์ค์น ์คํจ๊ฐ ๋ฉ๋๋ค. - โค ํด๊ฒฐ:
--no-builds์ต์ ์ผ๋ก ๋น๋์ ๋ณด ์๋ต, ๋๋ ์๋์ผ๋ก ํด๋น ํจํค์ง ๋ฒ์ ์ ๋จ์ํ.
- ๋น๋ ๋ฒํธ(
- pip ์ค์น๋ ํจํค์ง ํฌํจ ๋๋ฝ/๋ฒ์ ๋ฌธ์
conda env export๋ง์ผ๋ก๋ pip๋ก ์ค์น๋ ํจํค์ง๊ฐ ์ ๋๋ก ํฌํจ๋์ง ์๊ฑฐ๋, ์ด๋ฆ์ด ๋ฌ๋ผ์ ์ฌ์ค์น ์คํจํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.- โค ํด๊ฒฐ:
pip freeze๋ก ๋ฐ๋ก ๋คํํด๋๊ณ , ์์ฑ๋ ํ๊ฒฝ์์pip install -r pip_requirements.txt๋ฅผ ์ํ.
- ๋ก์ปฌ/์ปค์คํ
ํจํค์ง ๋๋ ๋น-๊ณต์ ์ฑ๋ ์ฌ์ฉ
- ์ด๋ค ํจํค์ง๋ ๊ณต์ conda ์ฑ๋์ด ์๊ณ ๋ก์ปฌ ๋น๋ํ๊ฑฐ๋ ์ปค์คํ ์ฑ๋(๊ธฐ์ ๋ด๋ถ ์ฑ๋)์ ์ฌ์ฉํ์ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ ํ๊ฒฝ์์ ๋์ผํ๊ฒ ์ค์น๋์ง ์์ผ๋ฉด ์ฌํ์ด ๊นจ์ง ์ ์์ต๋๋ค.
- โค ํด๊ฒฐ:
environment.yml์์channels:ํญ๋ชฉ์ ํ์ธํ๊ณ , ํ์ํ ์ถ๊ฐ ์ฑ๋์ ๋ช ์ํ๊ฑฐ๋ ์๋์ผ๋ก ์ค์น ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
- OS๋ ์ํคํ
์ฒ ๋ณ๊ฒฝ ์ ๋ฌธ์
- ๊ฐ์ ํ๊ฒฝ์ด๋ผ ํด๋ ์๋ณธ์ด Windows์ด๊ณ ๋์์ด Linux์ด๋ฉด ์์ ์ค์น ๋ถ๊ฐ๋ฅํ ํจํค์ง๊ฐ ์์ ์ ์์ต๋๋ค.
- โค ํด๊ฒฐ: ํ๋ซํผ์ ๋์ผํ๊ฒ ๋ง์ถ๊ฑฐ๋, OS-ํน์ ํจํค์ง๋ ์๋์ผ๋ก ์กฐ์ ํด์ผ ํฉ๋๋ค.
๐ง ์ฌํ ์ต์ : ๋ณต์ฌ/ํด๋ก ๋ฐฉ์
๋จ์ํ ๋ณต์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค:
์ด ๋ช ๋ น์ ๊ฐ์ ์์คํ ์์์ ํ๊ฒฝ์ ๊ฑฐ์ ๊ทธ๋๋ก ๋ณต์ฌํฉ๋๋ค. ๋จ, ์ด ๋ฐฉ์๋ ๋ก์ปฌ ๊ฒฝ๋ก(prefix)๋ ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ๋ฏ๋ก ์ด๋์ด๋ ๋ค๋ฅธ ๋จธ์ ์์๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
๋คํธ์ํฌ ์๊ฑฐ๋ ํจํค์ง ๋ค์ด๋ก๋๊ฐ ์ด๋ ค์ด ๊ฒฝ์ฐ์๋ condaโpack ์ ์ด์ฉํด์ ๋ฐ์ด๋๋ฆฌ ํํ๋ก ํ๊ฒฝ์ ๋ฌถ์ด ์ฎ๊ธฐ๋ ๋ฐฉ๋ฒ๋ ์กด์ฌํฉ๋๋ค. ๋ค๋ง ์ด ๋ฐฉ๋ฒ์ ๋์ ๋จธ์ ์ OS/์ํคํ ์ฒ๊ฐ ๋์ผํด์ผ ์์ ์ ์ ๋๋ค.
์๋๋ Conda ํ๊ฒฝ์ ์ต๋ํ ๊ทธ๋๋ก ์ฎ๊ธฐ๊ฑฐ๋ ์ฌํํ ๋, ํนํ ๋ก์ปฌ ๊ฒฝ๋ก, ์ฑ๋ ์ค์ , pip ํผํฉ ์ค์น ๋ฑ ๋ณต์กํ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ์ ๊ผญ ์ฒดํฌํด์ผ ํ ํญ๋ชฉ๋ค๋ก ๋ง๋ ์ฒดํฌ๋ฆฌ์คํธ์ ๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์ -ํ์ ์ด ํญ๋ชฉ๋ค์ ํ๋์ฉ ํ์ธํ๋ฉด โ๋ฒ์ ์ถฉ๋โโ์ค์น ์คํจโโํ๊ฒฝ ๊นจ์งโ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
โ ์ฒดํฌ๋ฆฌ์คํธ: ๋ณต์กํ Conda ํ๊ฒฝ ๋ง์ด๊ทธ๋ ์ด์ ์ฉ
๋ค์์ ํญ๋ชฉ๋ณ๋ก ์ค๋ช + ์ฒดํฌ ์ฌํญ์ ์ ๋ฆฌํ ๊ฒ์ ๋๋ค.
| No. | ํญ๋ชฉ | ์ค๋ช | ์ฒดํฌํด์ผ ํ ๊ฒ |
|---|---|---|---|
| 1 | ํ๊ฒฝ ํ์ผ ๋ด prefix: ๊ฒฝ๋ก ํ์ธ |
conda env export ๋ช
๋ น์ผ๋ก ์์ฑ๋ environment.yml ์์ prefix: ํญ๋ชฉ์ด ๋ค์ด ์์ผ๋ฉด, ๋์ ์์คํ
/๊ฒฝ๋ก๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ ์ค์น ์ ๊ฒฝ๋ก ์ถฉ๋์ด ์๊น๋๋ค. |
โ โข environment.yml ์ด์ด๋ณด๊ณ prefix: ํญ๋ชฉ์ด ์๋์ง ํ์ธโ โข ์๋ค๋ฉด ๋์ ๊ฒฝ๋ก์ ๋ง๊ฒ ์์ ํ๊ฑฐ๋ ์ญ์ |
| 2 | ์ฑ๋(channels:) ์ค์ | ํน์ ์ฑ๋(ex: conda-forge, custom local channel)์์ ํจํค์ง๋ฅผ ๋ฐ์์์ผ๋ฉด, ์ ํ๊ฒฝ์์๋ ๋์ผ ์ฑ๋์ด ์์ด์ผ ๋์ผ ๋ฒ์ ์ค์น ๊ฐ๋ฅ. ์ผ๋ถ ๋ก์ปฌ ์ฑ๋/ํ์ผ ๊ฒฝ๋ก ์ฑ๋์ URL ํํ๋ ๋ก์ปฌ ํ์ผ ๊ฒฝ๋ก๊ฐ ์๋ชป๋๋ฉด ์คํจํฉ๋๋ค. ([GitHub][1]) |
โ โข channels: ๋ฆฌ์คํธ ํ์ธ (์: - conda-forge, - defaults, - file:///โฆ)โ โข ๋ก์ปฌ ์ฑ๋ ์ฌ์ฉ ์ ํด๋น ํ์ผ๊ฒฝ๋ก/URL์ด ๋์ ๋จธ์ ์์๋ ์ ํจํ์ง ํ์ธ โ โข conda config --show channels๋ก ์ ์ญ ์ค์ ๋ ๊ฒํ |
| 3 | ํจํค์ง ๋น๋๋ฒํธ ๋ฐ ํ๋ซํผ ์์กด์ฑ | environment.yml์ ํจํค์ง๋ค์ด numpy=1.23.4=py39hโฆ_0์ฒ๋ผ ๋น๋๋ฒํธ ํฌํจ๋ ์ ์๊ณ , OS/์ํคํ
์ฒ๊ฐ ๋ฐ๋๋ฉด ๋์ผ ๋น๋๊ฐ ์์ ์ ์์ต๋๋ค. |
โ โข --no-builds ์ต์
์ผ๋ก exportํด๋ณด๋ ๊ฒ ๊ณ ๋ คโ โข Windows โ๏ธ Linux ๋ฑ ํ๋ซํผ์ด ๋ฐ๋๋ ๊ฒฝ์ฐ์๋ ๋ฒ์ ๋ง ์ง์ ํ๊ณ ๋น๋๋ฒํธ ์ ๊ฑฐ |
| 4 | pip ์ค์น๋ ํจํค์ง ํผํฉ ์ฌ๋ถ | Conda ํ๊ฒฝ์ pip install โฆ๋ก ์ค์น๋ ํจํค์ง๊ฐ ์์ฌ ์์ผ๋ฉด, conda env export๋ง์ผ๋ก ์์ ํ๊ฒ ๋ณต์ ๋์ง ์์ ์ ์๊ณ , pip + conda ์ถฉ๋์ด ์๊ธธ ์ ์์ต๋๋ค. ([docs.conda.io][2]) |
โ โข pip freeze ์ถ๋ ฅ๋ ํจ๊ป ์ ์ฅ (pip_requirements.txt)โ โข environment.yml ๋ด dependencies: ์๋ - pip: ๋ธ๋ก์ด ์๋์ง ํ์ธโ โข ์ ํ๊ฒฝ ์์ฑ ์: ๋จผ์ conda ํจํค์ง ์ค์น โ ๊ทธ ๋ค์์ pip ์ค์น ์์ ์ ์ง |
| 5 | ๋ก์ปฌ์ค์น๋ ํจํค์ง(์: ~/.local/lib/pythonX.Y) ๋๋ ์ฌ์ฉ์ site-packages ๋์ ์ฌ๋ถ |
์ฌ์ฉ์๊ฐ ์์คํ ์์ค ๋๋ ํ ๋๋ ํ ๋ฆฌ ์์ค์์ ์ค์นํ ํจํค์ง๊ฐ env ๋ด๋ถ์ ์ํฅ์ ์ค ์ ์์ผ๋ฉฐ, ๋ง์ด๊ทธ๋ ์ด์ ์ ๋๋ฝ๋๊ฑฐ๋ ์ถฉ๋์ด ์์ ์ ์์ต๋๋ค. ([docs.icer.msu.edu][3]) | โ โข PYTHONPATH / PYTHONHOME ํ๊ฒฝ๋ณ์๊ฐ ์ค์ ๋ผ ์๋์ง ํ์ธ ([docs.conda.io][4])โ โข ~/.local/lib/pythonX.Y ๋ฑ์ ์ค์น๋ ํจํค์ง๊ฐ ์๋์ง ํ์ธโ โข ํ๊ฒฝ ๊นจ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ ํด๋น ์ฌ์ฉ์ ์ค์น ๊ฒฝ๋ก ๋ฐฑ์ ๋๋ ์ ๊ฑฐ ๊ณ ๋ ค |
| 6 | ํ๊ฒฝ ๋ณ์(environment variables) ์ค์ ์ฌ๋ถ | Conda ํ๊ฒฝ์ ํน์ ํ๊ฒฝ๋ณ์(VAR=โฆ)๋ฅผ ์ค์ ํด ๋์์ผ๋ฉด, ์ ํ๊ฒฝ์์๋ ๋์ผํ๊ฒ ์ค์ ํด์ผ ๋์ผ ๋์ ๋ณด์ฅ๋ฉ๋๋ค. ([docs.conda.io][2]) |
โ โข conda env config vars list -n my_env ๋๋ conda env export ๋ด variables: ๋ธ๋ก ํ์ธโ โข ์ environment.yml์ variables: ์น์
์ ํฌํจํ๋์ง ํ์ธ |
| 7 | ๊ฒฝ๋ก ๋ฐ ์์ ๋๋ ํ ๋ฆฌ(dependencies referencing local path) | ํ๋ก์ ํธ ๋ด๋ถ์์ ๋ก์ปฌ ๊ฒฝ๋ก๋ก ์ฐธ์กฐํ๋ ํจํค์ง(์: - /home/user/project/mypkg ํํ)๋ Git submodule ๋ฑ์ด ์์ ๊ฒฝ์ฐ, ๋์ ๋จธ์ ์์ ๊ฒฝ๋ก๊ฐ ๋ฌ๋ผ์ง๋ฉด ์ค์น/์ฐธ์กฐ๊ฐ ๊นจ์ง ์ ์์ต๋๋ค. |
โ โข environment.yml ๋๋ requirements-pip.txt์ ๋ก์ปฌ ๊ฒฝ๋ก ์ค์น๊ฐ ์๋์ง ๊ฒ์โ โข Git submodule ๋๋ pip install -e ../local/package ์ ์ค์น๊ฐ ์๋์ง ํ์ธโ โข ๋์ ์์คํ ๊ฒฝ๋ก๋ฅผ ๋ง์ถ๊ฑฐ๋ relative path๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํ์ง ํ์ธ |
| 8 | OS/์ํคํ ์ฒ(Windows vs Linux vs macOS) ํธํ์ฑ | ์๋ณธ ํ๊ฒฝ์ด ํน์ OS/์ํคํ ์ฒ์์ ๋ง๋ค์ด์ก๋ค๋ฉด, ๋ค๋ฅธ OS/์ํคํ ์ฒ์์ ๋์ผํ ํจํค์ง ๋ฒ์ ์ด ์๊ฑฐ๋ ๋น๋๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. | โ โข conda info ๋ฐ conda list์์ ํ๋ซํผ ์ ๋ณด๋ฅผ ํ์ธโ โข ๋์ ๋จธ์ ํ๋ซํผ์ด ๋์ผํ์ง ํ์ธ โ โข ํ๋ซํผ์ด ๋ค๋ฅด๋ฉด ์ผ๋ถ ํจํค ๋ฒ์ ์ ์กฐ์ ํ๊ฑฐ๋ ์ ๊ฑฐ ๊ณ ๋ ค |
| 9 | ์ฑ๋ ์ฐ์ ์์ ๋ฐ strict priority ์ค์ | ์ฑ๋ ์ฐ์ ์์(channel_priority)๊ฐ ๋ค๋ฅด๋ฉด ๋์ผ ๋ฒ์ ํจํค์ง๋ฅผ ์ฐพ์ง ๋ชปํ๊ฑฐ๋ ๋ค๋ฅธ ๋น๋๊ฐ ์ค์น๋ ์ ์์ต๋๋ค. ([Ohio Supercomputer Center][5]) |
โ โข conda config --show channel_priority ๊ฐ ํ์ธ (์: strict vs flexible)โ โข environment.yml ์์ฑ ์ ๋์ผ ์ค์ ๋ฐ์ (ํ์์ conda config --set channel_priority strict) |
| 10 | ํจํค์ง ์บ์ ๋ฐ ๊นจ์ง ๋งํฌ ์ฌ๋ถ | ํจํค์ง ์บ์๋ ํ๋ ๋งํฌ ๋ฌธ์ ๋ก ํ๊ฒฝ์ด ๊นจ์ง๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ([docs.conda.io][4]) | โ โข ์คํ ์ค ImportError ๋๋ โํจํค์ง๊ฐ ์ค์น๋์ง๋ง import ์ ๋จโ ์ค๋ฅ ์๋์ง ํ์ธโ โข conda install -f <package> ๋ก ๊ฐ์ ์ฌ์ค์น ๊ฒํ โ โข ์ ํ๊ฒฝ ์์ฑ ์ ์ ์บ์ ์ ๋ฆฌ( conda clean --all) ๊ณ ๋ ค |
๐ ์ฌ์ฉ ํ
- ๋ง์ด๊ทธ๋ ์ด์ ์ ์์ํ๊ธฐ ์ ์ ์ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๋ฌธ์ํํด๋๊ณ , ์๋ณธ ํ๊ฒฝ์์ ์ฒดํฌํ ์ํ, ๋์ ํ๊ฒฝ์์ ์ฒดํฌํ ์ํ๋ฅผ ๊ธฐ๋กํด๋๋ฉด ์ดํ ์ถ์ ์ด ์ฌ์์ง๋๋ค.
environment.yml์์ฑ ์--no-builds์ต์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํ๋ซํผ/๋น๋๋ฒํธ ์ถฉ๋์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.- ์ ํ๊ฒฝ ์์ฑ ํ ๋ฐ๋ก ํ๋ก์ ํธ ์ฝ๋ ์คํ ์ ์ ๊ฐ๋จํ ํ
์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด
import ์ฃผ์_๋ชจ๋; print(๋ชจ๋.__version__)์์ผ๋ก ํ์ธํ๋ฉด ์ด์ ์ฌ๋ถ๋ฅผ ๋ฐ๋ก ์ ์ ์์ต๋๋ค. - ํนํ ์ฑ๋์ด๋ ๋ก์ปฌ ํจํค์ง ์ฐธ์กฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ, โ๋จผ์ conda ํจํค์ง ์ค์นโ โ โ๊ทธ๋ค์ pip ์ค์น/๋ก์ปฌ ์ค์นโ ์์๋ฅผ ์งํค๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ([docs.conda.io][2])
- ๊ธฐ๋กํด๋๊ธฐ: ์ด๋ค ๋ก์ปฌ ํจํค์ง๋ฅผ ์ฐธ์กฐํ๋์ง, ์ด๋ค ์ฑ๋์ ์ผ๋์ง, ์ด๋ค ํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํ๋์ง ๋ฑ์ ๋ฉ๋ชจํด๋๋ฉด โ์ ์ฌํ์ด ์ ๋์ง?โ ์ํ์์ ํด๋ต์ ์ฐพ๊ธฐ ์ฌ์์ง๋๋ค.
Reference
- โConda and Mamba - UC Berkeley Statisticsโ
- โHow could using Mamba instead of Conda as package manager for โฆโ
- โuv - Astral Docsโ
- โManaging Scientific Python environments using Conda, Mamba and โฆโ
- โEnvironments: Conda, Mamba, and all that โ OCESE Documentationโ
- โMamba vs Conda: Know the Differences and Similaritiesโ
- โuv: Python packaging in Rust - Astralโ
- โPSA: If youโre starting a new project, try astral/uv! : r/Python - Redditโ
- โ[Help Request] Python development, specifically with
uvfrom astral โฆโ - โAnaconda export Environment file - python - Stack Overflowโ
- โExport your conda envs โfrom-history - Monica Thieu, PhDโ
- โHow to export and import a conda environment without errorsโ
- โHow can you "clone" a conda environment into the base (root โฆโ
- โMoving Conda Environments - Anacondaโ