<WHY? ๊ฐ๋ ๋จผ์ ์๊ธฐ>
(๊ฐ์ํ๊ฒฝ์ ์ฌ์ฉํ๋ ์ด์ ์ ๋ํด์๋ ์ค๋ช ํ์ง ์์)
๋ ์ธ๋ถ์ ์ธ, ๊ฐ๊ฐ์ ์๋ํํฐ๋ค์ ์ฌ์ฉ ๋ชฉ์ ์ด์ ์ ๋ํด ์ค๋ช
pyenv & pip & poetry ์ ์ฐจ์ด์
- venv : python ๊ฐ์ํ๊ฒฝ์ ๋ง๋ค์ด์ค
- pyenv: ์ฌ๋ฌ ๋ฒ์ ์ python์ ์ค์นํ๊ณ ์ํ๋ python version์ ์ ํํ ์ ์๋๋ก ๋์์ค
- ์ฌ์ฉ์๋ณ๋ก ๊ธ๋ก๋ฒ ํ์ด์ฌ ๋ฒ์ ์ ์ค์ ํ ์ ์์ด์.
(Let you change the global Python version on a per-user basis.) - ํ๋ก์ ํธ๋ณ๋ก ํ์ด์ฌ ๋ฒ์ ์ ์ค์ ํ ์ ์์ด์.
(Provide support for per-project Python versions.) - ํ๊ฒฝ๋ณ์๋ก ํ์ด์ฌ ๋ฒ์ ์ ๋์ฒดํ ์ ์์ด์.
(Allow you to override the Python version with an environment variable.) - ํ ๋ฒ์ ์ฌ๋ฌ ๋ฒ์ ์ ํ์ด์ฌ์ ์ฌ์ฉํ ์ ์์ด์.
(Search commands from multiple versions of Python at a time.)
- poetry: ๊ฐ์ํ๊ฒฝ ์์ ํจํค์ง ๋ฒ์ ๊ด๋ฆฌ ํด์ฃผ๋ ์น๊ตฌ (== ex. requirement.txt)
<APPLY TO> ๊ฐ์ํ๊ฒฝ ๋ง๋ค์ด์ฃผ๊ธฐ
0๏ธโฃ pyenv ๋ฅผ ์ค์นํด์ฃผ์
(brew ์ค์น๋ ๋์ด์๋ค๊ณ ๊ฐ์ ! ๋ง์ฝ ์๋ค๋ฉด intel, m1 ์ ๊ตฌ๋ถํด์ ๊ตฌ๊ธ๋งํ๊ธฐ!)
0-1. pyenv ๋ฅผ ์ค์นํด์ค๋ค. (์๋ ๋ช ๋ น์ด ์ ๋ ฅ)
$ brew install pyenv
0-2. vi/vim ์๋ํฐ๋ฅผ ์ฌ์ฉํด์ ~/.zshrc ์์ ๋งจ ๋ง์ง๋ง์ ์๋ ๋ด์ฉ์ ์ถ๊ฐํ๋ค. ($ vi ~/.zshrc)
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
eval "$(pyenv init --path)"
fi
0-3. (์๋์ ๋ช ๋ น์ด๋ฅผ ํตํด) ์์ ๋ ~/.zshrc๋ฅผ ํ์ฌ shell์ ๋ฐ์ํ๋ค.
$ source ~/.zshrc
[TIP]
linux์์ source ๋ช ๋ น์ด๋ shell์ ์ด๊ธฐํ ํ์ผ(~/.bash_profile, ~/.zshrc) ์ ์์ ํ์ ๊ฒฝ์ฐ logoff ์ login ์ ํ์ง ์๊ณ ํ์ฌ shell session์ ์ค์ ์ ๋ฐ์ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ค.
0-4. (์๋ ๋ช ๋ น์ด๋ฅผ ํตํด): pyenv-virtualenv ์ค์น
$ brew install pyenv-virtualenv
[TIP] pyenv ๋ฟ๋ง ์๋๋ผ pyenv-virtualenv๋ ํจ๊ป ์ฌ์ฉํ๋ ์ด์
- (์ด์ , ์ฉ๋์ ๊ตฌ๋ถ) pyenv๊ฐ Python ๋ฒ์ ์ ๋ฐ๊ฟ์ฃผ๊ธฐ ์ํ ์ฉ๋๋ผ๋ฉด, pyenv-virtualenv๋ ๊ฐ์ํ๊ฒฝ์ ํจํค์ง์ ๋ฒ์ ๋ ํจ๊ป ๋ฐ๊ฟ์ฃผ๊ธฐ ์ํ ์ฉ๋ ์ด๋ค.
- (์์) pyenv์ ๋ชฉ๋ก์ virtualenv๊ฐ ํฌํจ๋๊ธฐ ๋๋ฌธ์, pyenv๋ฅผ ๋จผ์ ์ค์นํ ํ virtualenv๋ฅผ ์ค์นํ๋ค.
0-5. (์๋ ๋ช ๋ น์ด๋ฅผ ํตํด) ๋ณ๊ฒฝ ๋ฐ ์ ์ฉ
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
$ source ~/.zshrc
0-6. ์์ ๋ค์ ์คํํ๋ค.
$ exec "$SHELL"
1๏ธโฃ pyenv ๋ฅผ ์ด์ฉํด์ ์ฌ๋ฌ๊ฐ์ง python-version ์ ์ค์นํด์ฃผ๊ธฐ
1-1. (์๋ ๋ช ๋ น์ด): pyenv๋ฅผ ํตํด ์ค์น ๊ฐ๋ฅํ python-version ๋ชฉ๋ก ํ์ธ
$ pyenv install —list
1-2. (์๋ ๋ช ๋ น์ด): ์ํ๋ ํ์ด์ฌ ๋ฒ์ ์ค์น
$ pyenv install [python-version]
1-3. (์๋ ๋ช ๋ น์ด): ํน์ ํ์ด์ฌ ๋ฒ์ ์ญ์ == ๊ฐ์ํ๊ฒฝ ์ญ์
$ pyenv uninstall [python-version]
1-4. (์๋ ๋ช ๋ น์ด): ๋ด ์ปดํจํฐ์ ์ค์น๋ ํ์ด์ฌ (์ ์ฒด) ๋ชฉ๋ก ํ์ธ
$ pyenv versions
1-5. (์๋ ๋ช ๋ น์ด): ์ง๊ธ ๋ด ๋ก์ปฌ(๋ด ์ปดํจํฐ ์ ์ฒด)์์ ์ฌ์ฉํ ๋ฒ์ ์ค์
$ pyenv global [python-version]
[Description]
global ์ด๋ผ๊ณ ํํํ๋ ์ด์ ๋, ๋์ ๋ก์ปฌ PC๋ฅผ '์ ์ฒด'๋ผ๊ณ ํ์ ๋, ๊ฐ์ ํ๊ฒฝ๊ณผ ๊ทธ๊ณณ์ ์ ์ฉ๋๋ ๋ฒ์ ์ ๊ทธ ์ ์ฒด์ ๋ถ๋ถ๋ค์ด๋ค.
๋ถ๋ถ์ ํด๋น๋๋ ๊ฒ์ local, ์ ์ฒด์ ์ ์ฉํ๋ค๋ ์๋ฏธ๋ก global์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
[Add]
(์๋์์ ๋ ๋์ค๊ฒ ์ง๋ง,) ๊ฐ์ํ๊ฒฝ ์์์ $ pyenv local <environment_name> ์ ์ ๋ ฅํ๋ฉด, ํด๋น ๊ฐ์ํ๊ฒฝ์ ๋ง๋ค์์ ๋ ์ง์ ํด์คฌ๋ python ๋ฒ์ ์ local(๊ฐ์ํ๊ฒฝ, ๋ถ๋ถ)์์๋ง ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ๊ฐ ๋๋ค!
2๏ธโฃ pyenv-virtualenv ์ด์ฉํด์ ๊ฐ์ ํ๊ฒฝ ์์ฑ
2-1. (์๋ ๋ช ๋ น์ด๋ก) ์ ๊ฐ์ํ๊ฒฝ ์์ฑ
$ pyenv virtualenv (python-version) <environment_name> : python-version ์ง์
$ pyenv virtualenv <environment_name> : python-version ์๋ต
<environment_name>๋ ๋ณดํต ํ๋ก์ ํธ์ ๋์ผํ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ
python-version ์ ์๋ตํ๊ณ ๊ฐ์ํ๊ฒฝ์ ์์ฑํ๋ฉด ๋ด ์ปดํจํฐ์์ ์ฌ์ฉํ๋ python ๋ฒ์ ์ผ๋ก ์๋ ์ ๋ ฅ๋๋ค.
2-2. ์ ํ๋ฆฌ์ผ์ด์ ๋ณ(=ํ๋ก์ ํธ ๋ณ =๊ฐ์ํ๊ฒฝ ๋ณ) = loacl ๋ณ ํ์ด์ฌ ๋ฒ์ ์ ์ค์ (๋๋ ํ์) ํด๋๋ค.
๊ฐ์ํ๊ฒฝ์ ์ ์ฉํ๊ณ ์ถ์ ์์น์์ (์๋ ๋ช ๋ น์ด๋ฅผ ํตํด) <environment_name>์ด๋ผ๋ ๊ฐ์ํ๊ฒฝ ์ ์ฉ
$ pyenv local <environment_name>
2-1. (์์ ๋ช ๋ น์ด ์คํํ๋ฉด): ์๋ ์ด๋ฏธ์ง ๊ฐ์ด (ํ ํด๋ ์์น์) ๊ฐ์ํ๊ฒฝ ์ด๋ฆ์ ๊ฐ์ง .python-version ํ์ผ์ด ์์ฑ๋จ
์ ํํ๊ฒ ๋ฒ์ ์ด ๋ช์ธ์ง๋ ๊ฐ์ํ๊ฒฝ ์์์ $ python --version์ผ๋ก ํ์ธํ ์ ์๋ค.
(์์ ๋ช ๋ น์ด๋ ์๋ฌต์ ์ผ๋ก python ๋ฒ์ ์ ์๋ ค์ค!)
๊ฐ์ํ๊ฒฝ์ ํ๋ฆฌ์ผ์ด์ ๋ณ ํ์ด์ฌ ๋ฒ์
[TIP]
2-1. ๋ง๋ค์ด์ง ๊ฐ์ํ๊ฒฝ์ ํ์ด์ฌ (๋ฒ์ ์ด ์๋ ์์น) ํ์ธํ๊ธฐ: $ pyenv which python
2-2. ์ค์น๋(=์ ๊ณตํ๋) ํ์ผ๋ค (์์น) ํ์ธํ๊ธฐ: $ pyenv which pip
3. (์๋ ๋ช ๋ น์ด): ๊ฐ์ํ๊ฒฝ ์ญ์ ํ๊ธฐ
pyenv uninstall <๊ฐ์ํ๊ฒฝ์ด๋ฆ>
3๏ธโฃ ๊ฐ์ํ๊ฒฝ ํ์ฑ & ๋นํ์ฑํ ๋ช ๋ น์ด
[ํ์ฑ]
$ pyenv activate <environment_name>
[๋นํ์ฑ]
$ pyenv deactivate
๋ง์ฝ ํ์ฌ ํด๋ ์์น์ (์์ pyenv local <environment_name> ๋ช
๋ น์ด๋ก ์์ฑ๋) .python-version ํ์ผ์ด ์๋ค๋ฉด
$ pyenv shell ์ด๋ผ๋ ๋ช ๋ น์ด๋ก ๊ฐ์ํ๊ฒฝ์ ํ์ฑํ ํด์ค ์ ์๋ค.
[TIP]
์ฌ์ค pyenv shell ๋ช ๋ น์ด๋ ๋ด๊ฐ ์ง์ ์ ๋ ฅํด์ฃผ์ง ์์๋
.python-version ํ์ผ์ด ์๋ ํด๋์ ๋ค์ด๊ฐ๋ฉด pyenv๊ฐ ์๋์ผ๋ก .python-version ํ์ผ์ด ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฐ์ํ๊ฒฝ์ ํ์ฑํํด์ค๋ค.
4๏ธโฃ poetry ์ด์ฉํด์ "ํจํค์ง ๋ฒ์ ๊ด๋ฆฌ" ํด์ฃผ๊ธฐ!
4-0. ๊ฐ์ํ๊ฒฝ ํ์ฑํ ๋์๋ค๋ ์ ์ , pip๋ ์ค์น๋์ด์๋ค๋ ์ ์ (pip๋ python์ค์น์ ์๋ ์ค์น๋จ)
4-1. (์๋ ๋ช ๋ น์ด): poetry ์ค์นํ๊ธฐ
$ pip3 install poetry
4-2. (์๋ ๋ช ๋ น์ด): ์ ํ๋ฆฌ์ผ์ด์ ์์น(= ๊ฐ์ํ๊ฒฝ ์คํ๋ ์์น)์์ ์ฌ์ฉํ ํ๋ก์ ํธ ํจํค์ง ๊ด๋ฆฌ์(poetry)๋ฅผ ์์ฑ
poetry init
(์์ ๋ช ๋ น์ด ํ) ๊ณ์ enter(๊ธฐ๋ณธ ์ค์ ๊ฐ)ํ๋ฉด ์๋ ์ด๋ฏธ์ง์ฒ๋ผ toml ํ์ผ์ด ์์ฑ๋จ
4-3. (์๋ ๋ช ๋ น์ด๋ก) ํจํค์ง ์ค์นํ๊ธฐ (in ๊ฐ์ํ๊ฒฝ)
$ poetry add [package-name]
์ด ๊ฒฝ์ฐ, ์ถ๊ฐํ ํจํค์ง&๋ฒ์ ์ pyproject.toml ํ์ผ ์์ [tool.peotry.dependencies] ์๋์ ์ ํ๋ค.
[TIP]
[๊ฐ๋ฐํ๋ ์ ์ฅ์์ ๊ทธ๋๊ทธ๋ ํ์ํ ํจํค์ง ์ค์น์] add ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ๋๊ฒ ์ข๋ค.
add๋ก ํจํค์ง๋ฅผ ์ค์น(์ถ๊ฐ)ํ๋ค๋ฉด ํด๋น ํจํค์ง&๋ฒ์ ์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
BUT
[๋ง์ฝ ์ด๋ฏธ ๊ฐ๋ฐ์ด ์๋ฃ๋, ๋๋ ๊ฐ์ํ๊ฒฝ์ ๊ณต์ ํ๊ณ ์ถ์ ๋ ์ ์ฒด ํจํค์ง&๋ฒ์ ์ pyproject.toml ํ์ผ๋ก ๊ณต์ ๋ฐ๋๋ค๋ฉด]
์๋์ ๋ช ๋ น์ด๋ก pyproject.toml ํ์ผ์ ์ ํ์๋ ํจํค์ง&๋ฒ์ ์ ํด๋น ๊ฐ์ํ๊ฒฝ์ ์ค์นํด์ฃผ๋ ๊ฒ์ด ๋ ๋น ๋ฅด๋ค.
$ poetry update
or
$ poetry lock
(์ถ๊ฐ ๋ด์ฉ)
'poetry lock'์ 'poetry update'์ ์ฐจ์ด์ ์?
๋ ๋ค Python ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ์ธ Poetry๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ฉ๋๋ ๋ช
๋ น์ด์ด๋ค.
1. 'poetry lock' ๋ช
๋ น์ ํ์ฌ ํ๋ก์ ํธ์ ์์กด์ฑ์ ๊ณ ์ ์ํค๋ ์์
์ ์ํํ๋ค.
Poetry๋ 'pyproject.toml' ํ์ผ์ ํตํด ํ๋ก์ ํธ์ ์์กด์ฑ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ค.
'poetry lock' ๋ช ๋ น์ 'pyproject.toml' ํ์ผ์ ๋ช ์๋ ์์กด์ฑ ๋ฒ์ ์ 'poetry.lock' ํ์ผ์ ๊ณ ์ ์ํจ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ํ๋ก์ ํธ๋ฅผ ๋ค๋ฅธ ํ๊ฒฝ์์ ์ฌํํ๊ฑฐ๋ ๋ฐฐํฌํ ๋ ์ ํํ ์์กด์ฑ ๋ฒ์ ์ด ์ฌ์ฉ๋๋ค.
2. 'poetry update' ๋ช
๋ น์ ํ๋ก์ ํธ์ ์์กด์ฑ์ ์
๋ฐ์ดํธํ๋ ์์
์ ์ํํ๋ค.
์ด ๋ช
๋ น์ ์คํํ๋ฉด 'pyproject.toml' ํ์ผ์์ ์ ์๋ ์์กด์ฑ์ ์ต์ ๋ฒ์ ์ผ๋ก ์
๋ฐ์ดํธํ๊ณ 'poetry.lock' ํ์ผ๋ ๊ฐฑ์ ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ํ๋ก์ ํธ๊ฐ ์ต์ ๋ฒ์ ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
์ฃผ์ํ ์ : ์์กด์ฑ์ ์ ๋ฐ์ดํธํ ๋ ์์กด์ฑ ๊ฐ์ ํธํ์ฑ์ ์ ์งํด์ผ ํ๋ฉฐ, ๋๋ก๋ ์ ๋ฐ์ดํธ ํ์ ํ๋ก์ ํธ ์ฝ๋๊ฐ ๋์ํ์ง ์์ ์๋ ์์ผ๋ฏ๋ก ํ ์คํธ๊ฐ ํ์ํ๋ค.
4-4. (์๋ ๋ช ๋ น์ด): ํจํค์ง ์ญ์ ํ๊ธฐ
$ poetry remove [package-name]
โญ๏ธ ์๋ ๋ด์ฉ์ ์ปด๋ฐ์ปด ์ผ ๊ฒ ๊ฐ๋ค!!!! ํ์ํ ์ฌ๋๋ง ์ฐธ๊ณ ํ๊ธฐ! ๐
์์ ๋ด์ฉ๋๋ก
๋ด๊ฐ ์ฌ์ฉํ ํจํค์ง๋ค์ poetry ์ด์ฉํด์ install(add, ์ค์น)ํ๋๋ฐ๋
์๋ ์ด๋ฏธ์ง์ฒ๋ผ import fastapi โฌ ๏ธ ์ warning ๋์ด์๊ณ ,
'Import "fastapi" could not be resolved' ๋ผ๊ณ ๋์จ๋ค๋ฉด?!?!
โผ๏ธ ์ด์ ๋: python interpreter๊ฐ fastapi๋ฅผ ์ก์ง ๋ชปํ๊ณ ์๋ ์ํฉ์ด๋ค.
python ์ค์ ์ ๋ค์ ํด์ค์ fastapi(๊ฐ ์๋ ์์น๋ก) ์ ์ก๋๋ก ํด์ฃผ์!
1. $ poetry env info : ํ์ฌ ๊ฐ์ํ๊ฒฝ์ python Path๊ฐ ์ด๋์ธ์ง ํ์ธํ๋ค.
2. (์๋ํฐ๊ฐ vsc์ธ ๊ฒฝ์ฐ) ํ๋จ์ python-interpreter๊ฐ ์์ 1๋ฒ์ ๋์จ virtualenv-path๋ฅผ ๊ฐ๋ฆฌํค๋๋ก(์ ํ,selectํ๋๋ก) ๋ฐ๊ฟ์ค ๊ฒ์ด๋ค. ์๋ ์ฌ์ง์ Select Interpreter ๋ฅผ ์ ํํ๋ค.
3. (์๋ํฐ๊ฐ vsc์ธ ๊ฒฝ์ฐ) ์๋ํฐ์ ์์ชฝ์ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ๋์จ๋ค. ํ์ฌ ๊ฐ๋ฆฌํค๊ณ ์๋ python path๋ '~/.pyenv/versions/3.10.9/bin/python' ์ด๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ fastapi, pydantic ๋ฑ ์ฌ๋ฌ ํจํค์ง๋ฅผ ์ค์นํ ๊ฐ์ํ๊ฒฝ(local python)์ path๋ ๊ทธ ์๋์ ์๋ '~/.pyenv/versions/3.10.9/envs/fastapi-blog/bin/python' ์ด๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋๋ฒ์งธ ์น๊ตฌ๋ฅผ ์ ํํด์ฃผ๋ฉด ๋๋ค.
4. ๊ทธ๋ฌ๋ฉด ํ๋จ์ python-interpreter ์ด๋ฆ๋ ๋ฐ๋๊ฒ ๋๊ณ , import ํด์ค ์ฌ๋ฌ ํจํค์ง๋ค๋ warning ์์ด ์ ๊ฐ์ ธ์์ง๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ฐ๋ฐํ๊ฒฝ์ธํ ! ์ด์ ์์ ๋!!!!!
์์์ด ์ ๋ฐ์ด๋ผ๊ตฌ,,,! ์ด์ ์ ๋ฐํ์ผ๋๊น ๋๋จธ์ง ์ ๋ฐ(๊ฐ๋ฐ+์ด์ํด๊ฒฐ+๋ฐฐํฌ)๋ ํ์ดํ !!!!!๐ฅ