Photo by Chang Duong on Unsplash
Pipenv ๋ฅผ ๊ฒ์ํ๋ฉด ๊ตฌ๊ธ์์ ๋ฌด๋ ค 3๋ฒ์งธ์ ๊ฒ์๋๊ธฐ ๋๋ฌธ์ ํฐ ์ฑ
์๊ฐ์ ๊ฐ๊ฒ ๋๋ค์ ใ
ใ
Pipenv ๋ฅผ ์ฌ์ฉํ์๋ ๊ฒ์ ์์ ์ด์ง๋ง ์ต๊ทผ ์
๋ฐ์ดํธ๊ฐ ์๋
11์ 28์ผ ์
๋๋ค
์ต๊ทผ ๋ค์ด์ Pipenv ์ฌ์ฉ์ ํ์๋ ค๋ ๋ถ๋ค์ ๋ง๋ฅํ๊ณ ์์ต๋๋ค
์๋๋ฉด
pipenv install sqlalchem
(์๋๋ sqlalchemy ์
๋๋ค) ์ฒ๋ผ
ํจํค์ง ์ด๋ฆ์ด ์ค๋ฅ๊ฐ ๋๋ฉด ์ดํ์ pipenv install sqlalchemy
์ฒ๋ผ ์ ์์ ์ผ๋ก ์
๋ ฅํด๋
ERROR: ERROR: Could not find a version that matches sqlalchem
No versions found
Was https://pypi.org/simple reachable?
์ด๋ฐ ์ง์ฆ๋๋ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค. ์๋๋ฉด sqlalchem ์ด๋ผ๋ ํจํค์ง๋ฅผ Pipfile ์ ์ด๋ฏธ ๊ธฐ๋กํ๊ฑฐ๋ ์
๊ทธ๋์ Pipfile ์์ ์ ํจํค์ง๋ฅผ ์ง์ฐ๊ณ ๋ค์ ์ค์นํด์ผ ํฉ๋๋ค
pyenv
๋ก ๋์๊ฐ์๊ฑฐ๋, ๊ทธ๋ฅ Docker ๋ฅผ ์ฐ์ธ์.
์ ๋ ์์ฆ์ ๊ทธ๋ฅ ๋์ปค๋ก ํ๊ฒฝ์ ๋ง๋ค์ด์ ์ฝ๋ฉํฉ๋๋ค ใ
ใ
ใ
๋๋ฌด ํธํด์!
๊ทธ๋๋ ๊ณ์ ํ์๋ ค๋ฉด ์ด์ ์ฝ์ด ์ฃผ์๋ฉด ๋ฉ๋๋ค
ํ์ด์ฌ ๊ฐ์ํ๊ฒฝ ์ค์ ์ ๊ต์ฅํ ์ ์ฉํ Pipenv ์ค์น ๋ฐ ์ฌ์ฉ๋ฒ์ ๋ํ ๊ฐ๋จํ ๊ฐ์ด๋ ์
๋๋ค
๊ธฐ๋ณธ์ ์ธ ํ์ด์ฌ์ ๋ํ ์ง์๊ณผ, MacOS, Python3 ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ช
ํฉ๋๋ค (์๋์ฐ๋ ์ฃ์ก ๐)
ํ์ด์จ๋์คํ์ธ ์ฐ๋ฆฌ๋ค์๊ฒ ๋ช ๊ฐ์ง ์ด๋ฏธ ์ ๋ช
ํ ํจํค์ง๋ค์ด ์์ต๋๋ค
tensorflow, numpy, pandas, django, flask...
์ด๋ ๊ฒ ํ ๋ฒ ์ฏค ๋ค์ด๋ดค์๋ฒ ํ ํจํค์ง ์ค์
requests
๋ผ๋ HTTP client ํจํค์ง๊ฐ ์์ต๋๋ค!
๊ทธ๋ฆฌ๊ณ Pipenv
๋ requests
๋ฅผ ๋ง๋ kennethreitz
(์ผ๋ค์ค ๋ ์ด์ธ ) ๋ผ๋ ์ฌ๋์ด ๋ง๋
ํ์ด์ฌ ์ ์ฉ ๊ฐ์ํ๊ฒฝ ์ค์ ํจํค์ง ์
๋๋ค!
(The Hitchhikerโs Guide to Python! ๋ผ๋ ์ฑ ์ ์ ์์ด๊ธฐ๋ ํฉ๋๋ค! ์์ธํ๊ฑด ๋ธ๋ก๊ทธ!)
๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ง์ฐฌ๊ฐ์ง์ด์ง๋ง, ์์
ํ๋ ํ๊ฒฝ์ ๋๋จํ ์ค์ํฉ๋๋ค
๊ฐ์ ํ์ด์ฌ3 ๋ผ๊ณ ํ ์ง๋ผ๋ ๋ฒ์ ์ ๋ฐ๋ผ ์ง์์ด ๋๋ ํจํค์ง๋ค ๋ํ ๋ค๋ฅด๊ณ
๋ฌธ๋ฒ๋ ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค
๋ค๋ฅธ์ฌ๋๊ณผ ํ์
ํ ๋, ์๋ก ๊ฐ์ ํ์ด์ฌ ํ๊ฒฝ์์ ์์
ํ๊ณ ์ถ๋ค๋ฉด ๊ฐ์ํ๊ฒฝ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค
ํ์ด์ฌ์ ๊ฐ์ํ๊ฒฝ์ ๋ํ ๊ณต์ ๋ฌธ์์ ์ค๋ช
์ ์๋์ ๊ฐ์ต๋๋ค
๊ฐ์ ํ๊ฒฝ์ ํน์ ๋ฒ์ ํ์ด์ฌ ์ค์น์ ์ฌ๋ฌ ์ถ๊ฐ ํจํค์ง๋ฅผ ํฌํจํ๋ ์๋น๋ ํด๋ ํธ๋ฆฌ์ ๋๋ค.
์ถ์ฒ: https://docs.python.org/ko/3/tutorial/venv.html
ํ์ด์ฌ์ ๊ฐ์ํ๊ฒฝ์ ๋ ํ๋์ ํ์ด์ฌ์ ์ค์นํ๋ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค
์ ์ญ์ผ๋ก ํ์ด์ฌ์ ์ค์นํ๋ฉด (homebrew ๋ก ์ค์นํ๋ค๋ ๊ฐ์ ํ์)
๋ฑ์ด ์์ฑ๋ฉ๋๋ค
๊ฐ์ํ๊ฒฝ์ ์ด์ฉํ๋ฉด, ์ด๋ฌํ ์ค์ ์ ๊ฒฉ๋ฆฌ๋ ๊ณต๊ฐ์ ๊ตฌ์ฑ์์ผ ์ค๋๋ค
๊ฐ์ํ๊ฒฝ์ ์คํํ ๊ฒฝ์ฐ (activate.sh) ์ ์ผ์ด๋๋ ์ผ์ ๋ํด์๋ ์ด ๊ธ ์ ์ฐธ๊ณ ํด๋ณด์ธ์
๋๋ต์ ์ผ๋ก๋
PYTHON_PATH
์ ๊ฐ์ ํ๊ฒฝ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ๊ณผ ๊ฐ์ ์์ ์ ํฉ๋๋ค!
์์ฝํ๋ฉด,
๋ด ์ฝคํผํ์ ์ง์ ๋ ๋ฒ์ ์ ํ์ด์ฌ์ ํ๋ ๋ ์ค์นํ๋ค๊ณ ์๊ฐํ์๋ฉด ๋ ๋ฏ ํฉ๋๋ค
๋ง์ฝ OS ์์ค์ ํ๊ฒฝ๊น์ง ๋์ผํ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด, Docker ๋ฅผ ๊ณ ๋ คํด๋ณด์ธ์
์ด์ ๋ํ ์ค๋ช
์ ํ๋ฅญํ์ ๋ถ๋ค๊ผ์ ์ ์ค๋ช
ํด์ฃผ์
จ์ผ๋ ์ฝ์ด๋ณด์ธ์!
๋น์ฐํ์ง๋ง ์ค์น๋ฅผ ํด์ผ ์์ํ ์ ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ์ค์น ๋ฐฉ๋ฒ์ ์์๋๋๊ฑด ์์ฒญ ์ค์ํฉ๋๋ค
์๋๋ฉด ์ด์ํ๊ฒ ์ค์น๋๋ฉด ์ํจ ๊ฑธ ํธ๋๊ฒ ์ด๋ ค์์
์๋์ ๊ฐ์ ์์๋ก ์งํํฉ๋๋ค
MacOS ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก python2 ๊ฐ ์ค์น๋์ด ์์ต๋๋ค (Mojave ๊ธฐ์ค)
$ python --version
Python 2.7.15
$ python3 --version # ๋ง์ฝ ์ค์นํ์ง ์์ผ์
จ์ผ๋ฉด, ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ํน๋ณํ ์ด์ ๊ฐ ์๋๋ผ๋ฉด Python3 ๋ฅผ ์ฌ์ฉํด ์ฃผ์ธ์
Python 3.7.1
๋ง์ฝ Python3 ๋ฅผ ์ค์น ํ์ง ์์๋ค๋ฉด ์๋์ ๊ฐ์ด ์ค์นํด์ฃผ์ธ์
$ brew install python3 # ์์์ ์ด๋ฏธ ์ ๋ ์ค์น๋์ด ์์ด์ reinstall ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ต๋๋ค
pip ๋ฒ์ ํ์ธ (pip ๋ NodeJS์ npm ๊ณผ ๋น์ทํ ์ญํ ์ ํฉ๋๋ค)
$ pip --version
pip 18.0 from /usr/local/lib/python2.7/site-packages/pip (python 2.7) # homebrew ๋ก ์ค์นํ ๊ฒฝ์ฐ
$ pip3 --version
pip 18.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7) # homebrew ๋ก ์ค์นํ ๊ฒฝ์ฐ
python3 ๋ฅผ ์์ ์ ์ค์นํ์
จ๊ฑฐ๋
pip ์
๊ทธ๋ ์ด๋๋ฅผ ํ์ ์ง ์๊ฐ์ด ์ง๋ฌ๋ค๋ฉด ์
๊ทธ๋ ์ด๋๋ฅผ ํ๊ณ ์งํํ์๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค
$ brew reinstall python3
$ pip3 install pip --upgrade
$ pip3 --version
pip 18.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7) # ์
๊ทธ๋ ์ด๋ ์ฑ๊ณต ๐
์ ๊ฐ ์์์ pip์ pip3์ ๋ฒ์ ์ ๊ฐ๊ฐ ์ฒดํฌํ์๋
๊ดํธ ์์ (python 2.7) ๋๋ (python 3.7) ๋ก ๋ํ๋๋๊ฑธ ๋ณด์
จ๋์?
pip๋ ๊ฐ๊ฐ์ ํ์ด์ฌ ๋ฐํ์๊ณผ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค
๊ทธ๋์, StackOverflow ๊ฐ์ ๊ณณ์์ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ณต๋ถํ๋ฉด ์๋์ง ์์ ๋์์ด ๋ฐ์ํฉ๋๋ค
ํนํ๋ sudo pip install ๊ฐ์ฉ๋ํจํค์ง
๋๋ pip install ์งฑ์ข์ํจํค์ง --user
์ ๊ฐ์ ์ค์น ๋ฐฉ๋ฒ์
๊ฐ์ธ์ ์ผ๋ก๋ ์ฌํ๋ ํ ์ ์ ๊ณ ๊ฐ๋ ์กฐ์ธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค ๐น
sudo ๋ก ์ค์นํ๋ ๊ฒฝ์ฐ๋ ์์๊ฒ ์ง๋ง, ๊ถํ์ด ๊ผฌ์ฌ๋ฒ๋ฆด ๋ฌธ์ ๊ฐ ๋ค๋ถํฉ๋๋ค
์ค์น๋ sudo๋ก ํ๋๋ฐ, ํ์ด์ฌ ๋ฐํ์์ sudo ๊ถํ์ด ์๋ค๋ฉด...? ํจํค์ง ์คํ์ด ์๋๊ฒ ์ฃ ?
sudo ์ค์น์ ๋ฌธ์ ์ ๋ํด ์ ๋ค๋ค์ฃผ์ ๊ธ์ ์์ด ์๊ฐํฉ๋๋ค โ Sudo pip install์ ์๋ผ์!
๋ค์ ๋ณธ๋ก ์ผ๋ก ๋์์์,
pip ๋ python 2.7.15 ์ ๊ฒ์
๋๋ค. pip3 ๋ python 3.7.1 ์ ๊ฒ์ด๊ตฌ์
๋๋จํ ์ค์ํ ์ ์
๋๋ค. ๋ง์ฝ ์ ์ฌ์ค์ ์ธ์งํ์ง ๋ชปํ๊ณ
pip install pipenv
๋ผ๊ณ ํด๋ฒ๋ฆฌ๋ฉด
pipenv
๋ ๊ธฐ๋ณธ์ ์ผ๋ก python2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋๊ฒ ๋ ๊ฒ์
๋๋ค
์ต์ด์ ์ ์ ๋ฅผ Python3 ํ๊ฒฝ์ด๋ผ๊ณ ํ๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๋ ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์คํํด์ผ ํฉ๋๋ค
$ pip3 install pipenv
$ pipenv --version
pipenv, version 2018.11.26 # 181216 ๊ธฐ์ค
์ด์ ์ค์น๊ฐ ์๋ฃ๋์์ต๋๋ค.
๊ทผ๋ฐ ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์ ๋ถ๋ค์ homebrew ๋ก ์ค์นํ๋ ๋ฐฉ๋ฒ๋ ์๋ดํ๋๋ฐ
์ pip3 ๋ก ์ค์นํ๋์ง ๊ถ๊ธํด ํ์๋ ๋ถ๋ค์ด ๋ง์ ๊ฑฐ๋ผ๊ณ ์๊ฐํด์
์ผ๋ง ์ (์๋ง 9์ ๊ฒฝ), Python3 ์ stable ์ด 3.6.5 ์์ 3.7.1 ๋ก ์ฌ๋ผ๊ฐ๋ฉด์
homebrew ์ python3 ๊ธฐ๋ณธ ๋ฒ์ ๋ 3.7 ๋ฒ์ ์ด ๋์์ต๋๋ค
ํ์ง๋ง ๋ง์ ํจํค์ง๋ค์ด ์์ง 3.7 ์ ์ง์ํ์ง ๋ชปํ๊ณ ์์์ฃ (Pipenv ๋ ๋ง์ฐฌ๊ฐ์ง ์
๋๋ค)
๊ทธ๋์ homebrew ์์ Python3 ๋ฒ์ ์ ๊ฐ์ ๋ก 3.6.5_1 ๋ก ๋กค๋ฐฑํ๊ณ
๋ค์ Pipenv ๋ฅผ ์ค์นํด์ผ ํ๋ ๋ถ์์ฌ๊ฐ ์์์ต๋๋ค...
์ง๊ธ์ ๊ด์ฐฎ์ง๋ง ์ธ์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์
pip3 ๋ก ์ค์นํ๋ ๊ฒ์ ์ ํธํ๋ ํธ์
๋๋ค
์ผ๋จ pip3 ๋ก ์ ์ค์น๋์๋์ง,
Pipenv ์ ํ์ด์ฌ ๋ฐํ์์ด 3.7.1 ์ธ์ง ํ์ธํ๋ฉด ๋๊ฒ ์ต๋๋ค
$ pip3 freeze # ๋ง์ฝ ๋ค๋ฅธ ํจํค์ง๋ฅผ ์ค์นํ์
จ์ผ๋ฉด, ๋ ๋ํ๋๊ฒ ์ฃ
certifi==2018.11.29
pipenv==2018.11.26 # ์๋
virtualenv==16.1.0 # Pipenv์ ์์กด์ฑ์ธ ์๋
virtualenv-clone==0.4.0 # ์ ๋...
$ cd $HOME # ์ง์ผ๋ก...
$ mkdir pipenv-test && cd pipenv-test # ํ
์คํธํด๋ณผ ํด๋๋ฅผ ํ๋ ๋ง๋ค์ด์
$ pipenv shell # ์ด๋ฐ ์ค๋ช
ํ๊ฒ ์ง๋ง, ๊ฐ์ํ๊ฒฝ ์์ ๋ช
๋ น์ด ์
๋๋ค
(pipenv-test-tXHIoQb5) $ python --version # ์ด์ ๋ ์ด์ python3 --version ์ด ์๋์ ๋ ์ฐธ๊ณ ํ์ธ์
(pipenv-test-tXHIoQb5) $ pipenv --rm # ํ์ธํ์ผ๋ ์ง์์๋ค
(pipenv-test-tXHIoQb5) $ exit # ์ด ์์์ ๋๊ฐ์
$ cd .. && rm -rf pipenv-test # ์๋ง๊ฐ ๋ฌผ๊ฑด ์ผ์ผ๋ฉด ์ ์๋ฆฌ์ ๋๋ผ๊ณ ...
์ค์น๋ ์ ํ์ต๋๋ค. ์์์ด ๋ฐ ์ธ๋ฐ ์์๋ ํ๊ณ ์ค์น๋ ํ์ผ๋ ์ฌ์ค์ ๋ค ํ์ต๋๋ค
์ด์ ์ง์ง ์จ๋ด์ผ๊ฒ ์ฃ
์ผ๋จ ๋ชจ๋ฅด๋ฉด man-page ๋ฅผ ๋ณด๋๊ฒ ์ธ์ง์์
$ pipenv --help
Usage: pipenv [OPTIONS] COMMAND [ARGS]...
Options:
--where Output project home information.
--venv Output virtualenv information.
--py Output Python interpreter information.
--envs Output Environment Variable options.
--rm Remove the virtualenv.
--bare Minimal output.
--completion Output completion (to be eval'd).
--man Display manpage.
--support Output diagnostic information for use in GitHub
issues.
--site-packages Enable site-packages for the virtualenv. [env var:
PIPENV_SITE_PACKAGES]
--python TEXT Specify which version of Python virtualenv should
use.
--three / --two Use Python 3/2 when creating virtualenv.
--clear Clears caches (pipenv, pip, and pip-tools). [env
var: PIPENV_CLEAR]
-v, --verbose Verbose mode.
--pypi-mirror TEXT Specify a PyPI mirror.
--version Show the version and exit.
-h, --help Show this message and exit.
Usage Examples:
Create a new project using Python 3.7, specifically:
$ pipenv --python 3.7
Remove project virtualenv (inferred from current directory):
$ pipenv --rm
Install all dependencies for a project (including dev):
$ pipenv install --dev
Create a lockfile containing pre-releases:
$ pipenv lock --pre
Show a graph of your installed dependencies:
$ pipenv graph
Check your installed dependencies for security vulnerabilities:
$ pipenv check
Install a local setup.py into your virtual environment/Pipfile:
$ pipenv install -e .
Use a lower-level pip command:
$ pipenv run pip freeze
Commands:
check Checks for security vulnerabilities and against PEP 508
markers provided in Pipfile.
clean Uninstalls all packages not specified in Pipfile.lock.
graph Displays currently-installed dependency graph information.
install Installs provided packages and adds them to Pipfile, or (if
no packages are given), installs all packages from Pipfile.
lock Generates Pipfile.lock.
open View a given module in your editor.
run Spawns a command installed into the virtualenv.
shell Spawns a shell within the virtualenv.
sync Installs all packages specified in Pipfile.lock.
uninstall Un-installs a provided package and removes it from Pipfile.
update Runs lock, then sync.
๊ธฐ๋ฅ์ด ๋ง์๋ฐ, Commands ๋ ๋ช ๊ฐ ์๋ฉ๋๋ค
ํจํค์ง ๊ด๋ จ๋ ๋ช
๋ น์ด๋ check, clean, graph, install, lock, sync, uninstall, update
์คํ๊ณผ ๊ด๋ จ๋ ๋ช
๋ น์ด๋ open, run, shell
์ ๋์
๋๋ค
์๋์ ๊ฐ์ ์์๋ก ์ค์ต ํด๋ณด๊ฒ ์ต๋๋ค
๋จผ์ ๊ฐ์ํ๊ฒฝ์ ์ฒ์ ์์ฑํ๋ ค๋ฉด ์์ ๋์จ ๋ฐฉ๋ฒ์ฒ๋ผ
pipenv --python 3.7
๊ณผ ๊ฐ์ด ์์ํ ์ ์์ต๋๋ค
๋๋ pipenv shell
๋ก๋ ์์ํ ์ ์์ต๋๋ค
pipenv --python 3.7
๊ณผ pipenv shell
๋ช
๋ น์ด์ ์ฐจ์ด์ ์
pipenv --python ...
๋ช
๋ น์ด๋ ๊ฐ์ํ๊ฒฝ์ ๋ง๋ค๊ณ ๋์
๋ฐ๋ก pipenv shell
๋ช
๋ น์ด๋ก ๊ฐ์ํ๊ฒฝ์ ์ง์
ํด์ผ ํ๋ค๋ ์ ์
๋๋ค
์๋ฐํ ๋งํด์, pipenv shell
๋ช
๋ น์ด๋ ๊ฐ์ํ๊ฒฝ์ ์์ํ๋ค๋ ์๋ฏธ์ด๊ณ
(๋ง์ฝ ์๋ค๋ฉด ๊ฐ์ํ๊ฒฝ์ ์์ฑํ๊ณ ์์)
pipenv --python 3,7
์ ์์ํ๊ฒ, ํด๋น ๋ฒ์ ์ ํ์ด์ฌ ๊ฐ์ํ๊ฒฝ์ ๋ง๋๋ ์ญํ ๋ง ํฉ๋๋ค!
์ค์ํ ๊ฑด ์์ํ๋ ค๋ ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ์ ์์นํ ์ํ๋ก ๊ฐ์ํ๊ฒฝ์ ์์ฑํด์ผ ํ๋ค๋ ์ ์
๋๋ค.
ํ์ฌ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก, ๊ฐ์ํ๊ฒฝ ์ด๋ฆ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ด์ฃ
์๊น์ฒ๋ผ ๋จผ์ ์ค์ตํ ๋๋ ํ ๋ฆฌ๋ฅผ ํ๋ ๋ง๋ญ๋๋ค
$ cd $HOME
$ mkdir pipenv-tutorial && cd pipenv-tutorial
$ pipenv shell # ๋๋ pipenv --python 3.7
์ด๋ ๊ฒ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ์๋์ฒ๋ผ ์งํ๋ฉ๋๋ค
๊ฐ์ํ๊ฒฝ์ด ๋ง๋ค์ด ์ก์ต๋๋ค!
์ถ๊ฐ. ๋๋ ํ ๋ฆฌ ์ด๋ฆ ๊ธฐ์ค์ผ๋ก ๊ฐ์ํ๊ฒฝ์ ๋ง๋ค์ง๋ง
๋น์ฐํ๊ฒ๋ ~/pipenv-tutorial
์์ pipenv shell
์ ์คํํ๋ ๊ฒฝ์ฐ์
~/Desktop/pipenv-tutorial
์์ pipenv shell
์ ์คํํ๋ ๊ฒฝ์ฐ๋
๋ค๋ฅธ ๊ฐ์ํ๊ฒฝ์ ๋ง๋ค๊ฒ ๋ฉ๋๋ค
(pipenv-tutorial
๊น์ง๋ ๊ฐ์ง๋ง ๋ค์ -t1c6CZgR
๊ณผ ๊ฐ์ ์์๋ฌธ์๊ฐ ๋ค๋ฆ
๋๋ค
๊ฐ์ํ๊ฒฝ์ ํ์ด์ฌ์ ํ๋ ๋ ์ค์นํ๋๊ฑฐ๋ ๋น์ทํ๋ค๊ณ ๋ง์๋๋ ธ์ฃ ?
๊ทธ๋ผ ์ด๊ฑด ๋์ฒด ์ด๋ ์ค์น๋๋ ๊ฑธ๊น์?
pipenv --py
๋ช
๋ น์ด๋ก ํ์ธํ ์ ์์ต๋๋ค
(pipenv-tutorial-S-kj1fAT) $ pipenv --py
$HOME/.local/share/virtualenvs/pipenv-tutorial-S-kj1fAT/bin/python
$HOME
์ ์จ๊ฒจ์ง ๋๋ ํ ๋ฆฌ์ธ .local ์์ ๊น์ํ ์์ฑ๋๋ค์!
ํ์ด์ฌ์์ ํจํค์ง๋ฅผ ์ค์นํ๋ ๋ช
๋ น์ด๋ pip install
์
๋๋ค
Pipenv ํ๊ฒฝ์์๋ pipenv install
๋ก ์ค์นํ์๋ฉด ๋ฉ๋๋ค!
(pipenv-tutorial-S-kj1fAT) $ pipenv install requests
Installing requestsโฆ
Adding requests to Pipfile's [packages] โฆ
โ Installation Succeeded
Pipfile.lock (b0f7f1) out of date, updating to (7b9a03)โฆ
Locking [dev-packages] dependenciesโฆ
โ Success!
Locking [packages] dependenciesโฆ
โ Success!
Updated Pipfile.lock (b0f7f1)!
Installing dependencies from Pipfile.lock (b0f7f1)โฆ
๐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 5/5 โ 0
๋จ, ์ฌ๊ธฐ์ ๊ธฐ์กด ํจํค์ง ์ค์น ๋ฐฉ์๊ณผ๋ ๋ค๋ฅธ ์ ์ด ์์ต๋๋ค
๋ฐ๋ก npm ์ฒ๋ผ devDependencies ๋ฅผ ์ง์ํ๋ค๋ ์ ์
๋๋ค
pipenv install --dev requests
๊ณผ ๊ฐ์ด ์ค์นํ ๊ฒฝ์ฐ
Pipfile ์ [dev-packages] ํ์์ ๋ฆฌ์คํ
๋ฉ๋๋ค
$ cat Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
requests = "*" # ์ฌ๊ธฐ์
[packages]
requests = "*"
[requires]
python_version = "3.7"
๊ฐ๋จํ๊ฒ, ํ์ฌ ํ์ด์ฌ ๋ฒ์ ์ ์ถ๋ ฅํ๋ app.py
๋ผ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ฒ ์ต๋๋ค
ํ์ฌ ๊ฒฝ๋ก์ app.py
ํ์ผ์ ์๋์ฒ๋ผ ๋ง๋ค์ด ์ฃผ์ธ์
# ๐ app.py
import sys
def main():
print(sys.version)
if __name__ == '__main__':
main()
๊ทธ๋ฆฌ๊ณ ์คํํฉ๋๋ค
(pipenv-tutorial-S-kj1fAT) $ python app.py
3.7.1 (default, Nov 28 2018, 11:51:47)
[Clang 10.0.0 (clang-1000.11.45.5)]
๊ฐ์ํ๊ฒฝ ์์์ ์ ์คํ๋๋ค์!
๊ทผ๋ฐ, npm ์ฒ๋ผ npm run
๊ฐ์ ๊ธฐ๋ฅ์ ์์๊น์? ๋ผ๊ณ ๋ฌป๊ธฐ๊ฐ ๋ฏผ๋งํ๋ค์
๋น์ฐํ ์์ต๋๋ค pipenv run [COMMAND]
๋ก ์คํํ ์ ์์ต๋๋ค
๋จผ์ Pipfile ์ [scripts]
์น์
์ ๋ง๋ญ๋๋ค
(pipenv-tutorial-S-kj1fAT) $ vi Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
requests = "*"
[packages]
requests = "*"
[requires]
python_version = "3.7"
[scripts] # ์น์
์ ๋ง๋ค๊ณ
start = "python app.py" # ์คํํ ์ปค๋งจ๋๋ฅผ ์ถ๊ฐํ์ธ์, "" ๋ก ๊ฐ์ธ์ฃผ์ด์ผ ํฉ๋๋ค
์์ ๊ฐ์ด start ๋ผ๋ ์ปค๋งจ๋๋ฅผ ์ถ๊ฐํ์ผ๋ฉด ์ด๋ ๊ฒ ์คํํ ์ ์์ต๋๋ค
(pipenv-tutorial-S-kj1fAT) $ pipenv run start
3.7.1 (default, Nov 28 2018, 11:51:47)
[Clang 10.0.0 (clang-1000.11.45.5)]
pipenv shell
๋ช
๋ น์ด๋ฅผ ์์ฑํ๋ฉด, ์ด ๋ ๊ฐ์ง ํ์ผ์ด ์์ฑ๋ฉ๋๋ค
์ด ํ์ผ๋ค์ ์ด๋ค ์ญํ ์ ํ ๊น์?
์ฝ๊ฒ ์ค๋ช
ํ์๋ฉด, npm ์ package.json
, package-lock.json
์ ๊ฐ๊ฐ ๋์๋ฉ๋๋ค
Pipfile
์ Pipenv ๊ฐ์ํ๊ฒฝ์ด ์ฐธ๊ณ ํด์ผํ ์ค์ ์
๋๋ค
(๊ฐ์ํ๊ฒฝ์ ํ์ด์ฌ ๋ฒ์ , ์ค์นํด์ผํ ํจํค์ง, ์คํฌ๋ฆฝํธ ๋ฑ)
Pipfile.lock
์ deterministic-builds(๊ฒฐ์ ๋ก ์ ๋น๋) ๋ฅผ ๊ตฌํํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค
โ ๏ธ ๊ฒฐ์ ๋ก ์ ๋น๋๋?
Be able to get the exact same set of dependencies on multiple machines.
โ ์ด๋ค ์ํฉ์์๋ ๋์ผํ๊ฒ site-packages tree ๋ฅผ ์ ์งํ๋ฉฐ ์ค์นํ ์ ์๋๋ก ํจ์ ์๋ฏธํฉ๋๋ค
npm ํํ์ด์ง์ ๊ธ์ ์ฝ์ด๋ณด์๋ฉด ์ข ๋ ์์ธํ ์ฐธ๊ณ ํ์ค ์ ์์ต๋๋ค
์ค์ต์ด ๋๋ฌ์ผ๋ ์ ๋ฆฌ๋ฅผ ํด์ผ๊ฒ ์ด์
pipenv --rm
๋ช
๋ น์ด๋ก ๊ฐ์ํ๊ฒฝ์ ์ญ์ ํฉ๋๋ค
๋จ, ์์ฑ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ญ์ ์์๋ ํ๋ก์ ํธ ํด๋๋ก ์ด๋ํ์ฌ ๋ช
๋ น์ด๋ฅผ ์คํํด์ผ ํฉ๋๋ค
(pipenv-tutorial-S-kj1fAT) $ pipenv --rm
Removing virtualenv (/Users/doondoony/.local/share/virtualenvs/pipenv-tutorial-t1c6CZgR) โฆ
์ ๋ง ์ง์์ก๋์ง ์๊น ์ ๊น ์ฟ๋ณด์๋ ๊ฒฝ๋ก ($HOME/.local/**/...) ์์ ์ง์ ํ์ธํด ๋ณผ๊น์?
$ ls -al ~/.local/share/virtualenvs
... ์์ ... ๋๋ ๋ฐ๋ก ์์ฑํ์ ๊ฒ ์์ผ๋ฉด ๋ญ๊ฐ ๋์ฌ์ง๋ ...
์ง์ ~/.local/share/virtualenvs ์์ ๊ฐ์ํ๊ฒฝ ํด๋๋ฅผ rm -rf
๋ช
๋ น์ด๋ก ์ญ์ ํด๋ ๋ฉ๋๋ค
์ง์ฐ๋๊ฒ๋ ๊ฐ๋จํ๋ค์!
pipenv ๋ ๊ฐ๋จํ๊ฒ ๊ฐ์ํ๊ฒฝ์ ์์ฑํด์ฃผ๊ณ
๊ฒฐ์ ๋ก ์ ๋น๋๊ฐ ๊ฐ๋ฅํ๋๋ก ํ์ฌ ํ์
์ ๊ต์ฅํ ์ข์ต๋๋ค
๋ค๋ง, ๊ฐ์ธ์ ์ธ ์๊ฐ์ผ๋ก๋ ์คํ์์ค์ด๋ค ๋ณด๋
Python3 ์ ๋ฒ์ , Pip ์ ๋ฒ์ ์
๊ทธ๋ ์ด๋์ ๋ฐ๋ก๋ฐ๋ก ๋์ํ๊ธฐ๋ ์ด๋ ค์ด ๋ฏ ํฉ๋๋ค
์ ๊น ์ผํฌํธ์ ๊น์๋ฉด...
์ต๊ทผ pip18.1 ๋ก ์
๊ทธ๋ ์ด๋ ๋๋ฉด์, pipenv ์ ์ถฉ๋์ด ์์์ต๋๋ค (ํ์ฌ๋ ํด๊ฒฐ)
์ด์ ๋ํ ์ด์ ์ฐ๋ ๋์ธ๋ฐ
"๊ฑด์ค์ ์ด์ง ๋ชปํ ๋ฉ์์ง๋ฅผ ํผํ๊ณ ์ง์ ๋ฐ์ ์ ๊ธฐ์ฌํด์ฃผ๋ฉด ์ข๊ฒ ์ด.
์ฐ๋ฆฌ๋ ์ธ์ ๋ ์ฌ๋๋ ๋ชจ์๋ฅด๊ธฐ ๋๋ฌธ์ ๊ธฐ๊บผ์ด ๋์ ๋์์ ๋ฐ์ ์ํฅ์ด ์์ด"
์ ๊ฐ์ด ์ด์ผ๊ธฐํ๋ ๊ฑธ๋ก ๋ด์, ์คํ์์ค๋ ํ๋ ๊ฑฐ๊ตฌ๋ ๋๋ผ๊ฒ ๋์์ต๋๋ค ๐ค
Pipfile, Pipfile.lock ํ์ผ์ ํตํด, ๊ฐํธํ๊ฒ ํจํค์ง ๋ฐ ํ์ด์ฌ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ฉฐ
(pyenv
, virtualenv
, virtualenvwrapper
๋ชจ๋ ์ฌ์ฉํด ๋ณด์์์ต๋๋ค! ์ด๊ฒ ๊ฐ์ฅ ํธํด์)
python2 ์ python3 ๊ฐ์ํ๊ฒฝ์ ๊ฐ๊ฐ ๋ง๋๋๊ฒ ์ ๋ง ์ฝ๋ค๋ ์ ๋ํ ์์ฒญ๋ ๋ฉ๋ฆฌํธ ์
๋๋ค
์ด ์ธ์๋ ๋ ๋ง์ ๊ธฐ๋ฅ์ด ์์ผ๋ ์ฌ๊ธฐ์์ ์ฐธ๊ณ ํ์ธ์!
ํธ๋ฆฌํ ๊ธฐ๋ฅ๋ค์ด๋...
๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๋ง์ฝ Pipenv ์คํ ๊ณผ์ ์์ ValueError: unknown locale: UTF-8
์๋ฌ ๋ฉ์์ง๊ฐ ๋ํ๋๋ฉด
์ฌ๊ธฐ์์ ์๋ดํ๋๋๋ก ์กฐ์นํ์ธ์
ํญ์ ์ ์ฑ๊ฐ๋ํ ๊ธ~!
์ ์คํฌ๋กค ์ด๋ง๋ฌด์ํ ์ค์ท์ ์ด๋ป๊ฒ ์ฐ์ผ์ ๊ฑฐ์ฃ ใ
ใ
๊ธ ์ ์ฝ์์ต๋๋ค.
Your Pipfile now contains pinned versions, if your requirements.txt did. We recommend updating your Pipfile to specify the "*" version, instead.
์ฒ๋ผ, pipenv๊ฐ version specifier๋ฅผ "*"๋ก ์ค์ ํ๋๋ก ํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
pipenv shell
๋ก ๊ฐ์ ํ๊ฒฝ์ ์ ์ ํ python run
ํ๋ ๊ฑฐ๋ pipenv run
ํ๋ ๊ฑฐ๋ ๊ฐ์ ๊ฒ ๊ฐ์๋ฐ, pipenv run
์ปค๋งจ๋๊ฐ ๋ฐ๋ก ์ง์๋๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?์ค๋ pipenv์ ๊ด๋ จํด์ ์์
ํ๋ค๊ฐ ์๋ฃ๋๋ ์ด ๊ธ์ด ์๊ฐ๋์.. pipenv install --system
์ปค๋งจ๋๋ system python์ ์์กด์ฑ์ ์ค์นํฉ๋๋ค. pipenv๋ก ๊ด๋ฆฌ๋๊ณ ์๋ ํ๋ก์ ํธ๋ฅผ ECS์ ๋ฐฐํฌํ๊ฑฐ๋ ํ๋ฉด Dockerfile์ ์์กด์ฑ์ ์ค์นํ๋ ์ปค๋งจ๋๋ฅผ ๋ฃ์ด์ผ ํ ํ
๋ฐ, ๊ทธ๋ฅ pipenv install
์ venv๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด ๋์ด์ --system
์ต์
์ด ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐ์ ๋งค์ฐ ์ข์ ๊ฒ ๊ฐ์์.
์ ๋ง ์ ์ฑ์ค๋ฐ ๊ธ์ ๋๊ธ์ ์์ธ๋์ผ ์์ธ์๊ฐ ์๋ค์
์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค.
ํน์ ์ถ๊ฐ๋ก, zsh ์ค์ ํ ๊ฒ๋ ๋์ค์ ์ฌ๋ ค์ฃผ์๋ฉด ์๋ ๊น์? ๋งค์ฐ ํ๋๋ค์!
์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค~