์ virtualenv๊ฐ ์์ฑ๋๋ฉด ํด๋น virtualenv์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์ค์น๋ฉ๋๋ค. ์ด๋ฌํ ๊ฒ๋ค ์ค ํ๋๋ python ํจํค์ง ์ค์น ํ๋ก๊ทธ๋จ์ธ pip์ ๋๋ค.
Linux์์ pip ์คํ ํ์ผ์ ์ ธ ์คํฌ๋ฆฝํธ์ ๋๋ค. ์ด pip ์ ธ ์คํฌ๋ฆฝํธ์ ๋งจ ์์๋ virtualenv์์ python ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ง์ ํ๋ shebang(#!) ์ค์ด ์์ต๋๋ค. ์ด ์ค์๋ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ์ ๋ํ ์ ๋ ๊ฒฝ๋ก๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
virtualenv์ python ์ธํฐํ๋ฆฌํฐ์ ๋ํ ์ ๋ ๊ฒฝ๋ก๊ฐ ๋งค์ฐ ๊ธธ๋ฉด(๊น๊ฒ ์ค์ฒฉ๋๊ฑฐ๋ ํฐ ๊ฒฝ๋ก ์ด๋ฆ) shebang ํ์ ํ์ฉ๋๋ ์ต๋ ๊ธธ์ด๋ฅผ ์ด๊ณผํ ์ ์์ต๋๋ค.
shebang ๋ผ์ธ์ ์ต๋ ๊ธธ์ด๋ /usr/include/linux/binfmts.h์ ์ค์ ๋ BINPRM_BUF_SIZE์ ์ํด ์ปค๋์์ ์ ํ๋ฉ๋๋ค. ๋ด๊ฐ ๋ณธ Linux ์์คํ ์์ ์ด ์ ํ์ 128๋ก ์ค์ ๋์ด ์์ต๋๋ค.
๋ฐ๋ผ์ python virtualenv๊ฐ ์์ฑ๋๋ ๊ฒฝ๋ก๊ฐ ๋๋ฌด ๊ธธ์ด์ง๋ฉด ํด๋น virtualenv์ pip๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ํ์ง ์์ต๋๋ค. "์๋ชป๋ ์ธํฐํ๋ฆฌํฐ: ํด๋น ํ์ผ ๋๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์์ต๋๋ค" ์ค๋ฅ์ ํจ๊ป ์คํจํฉ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ pip๋ฅผ ์ง์ ์คํํ์ง ์๊ณ virtualenv์ python ์ธํฐํ๋ฆฌํฐ๋ฅผ ์คํํ๊ณ pip ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์์ค๋ก python์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
์ ๋ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ต๋๋ค.
๋๋.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๋ํผ ์คํฌ๋ฆฝํธ๋ ์ค์ ๋ก setuptools(sdist์์ ์ค์นํ๋ ๊ฒฝ์ฐ) ๋๋ distlib(ํ ์์ ์ค์นํ๋ ๊ฒฝ์ฐ)์ ์ํด ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด ๋ฌธ์ ์ ๋ํ ์์ ์ฌํญ์ ํด๋น ํ๋ก์ ํธ์์ ์ค์ ๋ก ์์ฒญํด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด OS ์ ํ์ด๋ผ๋ฉด ์คํ ๊ฐ๋ฅํ ์์ ์ด _์์๊น์_? ํ๋ Perl์ด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ธฐ ์ํด ๋ง๋ฒ์ ์ฃผ๋ฌธ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
#!/bin/sh
eval 'exec /the/long/interpreter/path/to/python $0 ${1+"$@"}'
Python์ด eval-exec ํ์ ์คํํ์ง ์๋๋ก ์ถ๊ฐ ํญ๋ชฉ์ด ํ์ํ์ง๋ง ์๋ํ ์ ์์ต๋๋ค.
setuptools ๋ฐ distlib์ ๋ํ ๊ธฐ๋ฅ ์์ฒญ์ผ๋ก ์ด์ ๊ฐ์ ๊ฒ์ ์ ์ํ๊ณ ์ถ์ ์ฌ๋์ด ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ python virtualenv๊ฐ ์์ฑ๋๋ ๊ฒฝ๋ก๊ฐ ๋๋ฌด ๊ธธ์ด์ง๋ฉด ํด๋น virtualenv์ pip๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์์คํ
์์ virtualenv
๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ _์ ๋ง_ ์ข์ ๊ฒ์
๋๋ค. ๋ช
๋ น์ ์ด๋ฌํ ๊ธด ๊ฒฝ๋ก ์ด๋ฆ์ ๊ฐ์ง ๋๋ ํ ๋ฆฌ์ ์๋ ๊ฒ์ด ๋ณธ์ง์ ์ผ๋ก ์ง์๋์ง ์๋๋ค๋ ์ผ๋ถ ๊ฒฝ๊ณ (๋๋ ์ค๋ฅ)๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ํ์ฌ ๊ธฐ๋ณธ๊ฐ.
์ด๊ฒ๋ ๋๋ ค์. pwd์ ๋ํ _๋งค์ฐ_ ๊ธด ๊ฒฝ๋ก๊ฐ ์๋ Jenkins ๋น๋ ๋ด์์ pip
๋ฅผ ์คํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํนํ ๋ฌธ์ ์
๋๋ค. ํฅ๋ฏธ๋กญ๊ฒ๋ ๋์ผํ ๋น๋ ์ฌ๋ ์ด๋ธ๊ฐ ์ฌ๋ฌ ๊ฐ ์์ผ๋ฉฐ(๋ชจ๋ BINPRM_BUF_SIZE๊ฐ 128๋ก ์ค์ ๋๊ณ ๋์ผํ pip ๋ฐ python ๋ฐ virtualenv ๋ฒ์ ์ด ์์) ๊ฒฝ๋ก ๊ธธ์ด๊ฐ ๋ค์ํ๋๋ผ๋ ์ผ๋ถ์์๋ ์ด๋ฌํ ํ์์ด ๋ฐ์ํ์ง๋ง ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
@b-long์ ์ ์์ด ๋ง์์ ๋ญ๋๋ค. virtualenv
๊ฐ ํ์ฌ ์์คํ
์์ ์๋ํ์ง ์๋ ๋ํผ๋ฅผ ๋ง๋ค๋ ค๋ ๊ฒฝ์ฐ ์ต์ํ ์ฌ์ฉ์์๊ฒ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
virtualenv๊ฐ ์ด ์ํฉ์ ๊ฐ์งํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ช ํํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ C ํค๋์ ๊ฐ์ ์ ํํ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ด ์ ํ์ด ์๋ ์์คํ ์ ์์์ ์ด๋ป๊ฒ ๊ฐ์งํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค(Windows์๋ ์์ง๋ง OSX์๋ ์์ต๋๊น?)
virtualenv ๋ฌธ์ ๊ฐ ์๋๋ผ OS ์ ํ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ๋ซ๊ณ ์ถ์ต๋๋ค.
๊ฐ์น์๋ ์ผ์ ๋ํ ๋ช ๊ฐ์ง ์๊ฐ...
ctypes
ํ ์ ์์ต๋๊น?# on Linux, BINPRM_BUF_SIZE == 128, giving us a maximum shebang length of 127
# 2 bytes for #!, 11 bytes for '/bin/python' leaves us with 114
if sys.platform() == 'Linux' and len(home_dir) > 114:
log.warn("bin/activate may not work your system, as the length of the shebang line will exceed 128 characters")
๋ค๋ฅธ ์ฌ์ฉ์๋ค๋ ๋ด๊ฐ ์ ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋์ด ํ๊ฐํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ์๊ฒฌ์ ์ ์ํ๊ณ PR์ ์๊ฐ์ ์ฃผ๊ธฐ ์ํด ์ด๊ฒ์ ์ด์ด๋ ์ ์์ต๋๊น? @jantman ๊ณผ @pfmoore ๊ฐ์ฌํฉ๋๋ค :smile:
BINPRM_BUF_SIZE
๋ ์ปค๋ ํค๋์ ์ ์๋์ด ์์ผ๋ฉฐ ์์์ ์ปค๋ ๊ธฐ๋ฅ์์๋ง ์ฌ์ฉ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ด๋ฅผ ๊ฐ์งํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค(ํค๋์์ ์ฝ๊ธฐ๊ฐ ์งง๊ณ ์คํ ๊ฐ๋ฅํ์ง ์์).
์ฆ, ์ด๊ฒ์ด ๊ณง ๋ณ๊ฒฝ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค( ์ฌ๊ธฐ์ ์ต๋ shebang ๊ธธ์ด์ ๋ํ ๊ฐ๋ตํ ๊ฐ์๊ฐ execve(2) ๋งค๋ด์ผ ํ์ด์ง ์ "์ฐธ๊ณ " ์น์ ์๋ ๋ช ํํ๊ฒ ๋์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ "์คํ ๊ฐ๋ฅํ ์ ์คํฌ๋ฆฝํธ์ ์ฒซ ๋ฒ์งธ ์ค์๋ ์ต๋ ์ค ๊ธธ์ด๊ฐ 127์๊น์ง ํ์ฉ๋ฉ๋๋ค."๋ผ๊ณ ๋ช ์๋์ด ์์ต๋๋ค.
๋ชจ๋ POSIX ํธํ ์ด์ ์ฒด์ ์๋ ์ผ์ข ์ ์ ํ์ด ์๋ค๊ณ ๊ฐ์ ํ์ง๋ง, ๊ทธ ์ค ์ผ๋ถ, ํนํ BSD ๋ณํ์๋ 8,000์๋ฅผ ์ด๊ณผํ๋ ์ ํ์ด ์์ ์ ์์ต๋๋ค.
์์ ์ ์(ํ๋ซํผ์ด Linux์ด๊ณ ์ค์ด 127์๋ณด๋ค ๊ธด ๊ฒฝ์ฐ)์ฒ๋ผ ์์งํ ๊ฒ์ ๋จ์ํ ํ๋ ์ฝ๋ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ธ ์๋ฃจ์ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ๋์๊ฒ๋ ์ง๋์น๊ฒ ์กฐ์กํ๊ณ ๊ตฌ์ฒด์ ์ด๋ฉฐ ์ตํต์ฑ์ด ์์ต๋๋ค.
virtualenv
์ ๋๋ฌด ๋ง์ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ์ง ์๋ ๋ฐฉ์์ผ๋ก ์ด๊ฒ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ํ
์คํธํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ฌ์ ํ ์๊ฐํ๊ณ ์์ต๋๋ค. d ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ํ์ฉ๋ ์ ์๋ค๊ณ ๊ฐ์ ).
์ฃผ์ด์ง ๊ฒฝ๋ก๊ฐ ํ์ฉ ๊ฐ๋ฅํ ๊ธธ์ด์ธ์ง ์ฌ๋ถ๋ฅผ ํ ์คํธํ๋ ๊ฐ๋จํ ๊ฐ๋ ์ฆ๋ช ์ฝ๋๊ฐ ์์ง๋ง ๋์คํฌ์ ํ์ผ์ ์์ฑํ ๋ค์ ์ถ๋ ฅ์ ์บก์ฒํ๊ธฐ ์ํด ํ์ผ์ ์คํํ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ณด๊ธฐ ํํฉ๋๋ค. ์์ ๋ฐ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://gist.github.com/jantman/ba39f98936643bc948bd
๋ฐค์ด๋ผ๊ณ ๋ถ๋ฌ์ผ ํ๊ฒ ์ง๋ง, ์ด์ฏค์์ ๋ค์ ํด๋ด์ผ๊ฒ ์ต๋๋ค. ๋ค๋ฅธ Linux ์ฌ์ฉ์๋ ๋น์ทํ ์ ํ์ด ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ ๋ค๋ฅธ OS ์ฌ์ฉ์์ ์๊ฒฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
ํ๊ณ์ ๋ํด ๊ฐ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊น๋ค๋ก์ด ์์ ์ ์ํํ๋ ๋์ ๊ธฐ๋ฅ ํ ์คํธ bash ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ด๋ป์ต๋๊น? ํ์ด์ฌ์ด ์ฌ๋ฐ๋ฅด๊ฒ ํธ์ถ๋๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ณต์ญ์ ๊ฐ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๋ ์ง ์์ต๋๋ค.
๋ค์ ๋งํด์:
setuptools
๋ฐ distlib
PR์ ์ ์ถํ์ธ์. ์ฝ๋๋ virtualenv ๋๋ pip์ ์์ต๋๋ค.virtualenv ๋ฌธ์ ๊ฐ ์๋๋ฏ๋ก ์ด ๋ฌธ์ ๋ฅผ ๋ซ์ต๋๋ค(๊ธด ๋๋ ํ ๋ฆฌ ์ด๋ฆ์ ์ ์ฒด Python ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ค์นํ์ฌ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์).
์ฐ๋ฆฌ๋ ๋ฐฉ๊ธ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
PATH์์ ํ์ด์ฌ์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? virtualenv๋ ์ด๋ฏธ bin dir ์์ ์ถ๊ฐํฉ๋๋ค.
#!/usr/bin/env python
virtualenv๋ ์ด๋ฏธ bin dir ์์ ์ถ๊ฐํฉ๋๋ค.
virtualenv๋ฅผ ํ์ฑํํ๋ ๊ฒฝ์ฐ์๋ง. Virtualenv๋ ํ์ฑํ ์์ด ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ํฉ๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ ํผ๋์ค๋ฝ๊ฒ ์๊ฐํ๋ค๋ฉด:
์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ pip๋ฅผ ์ง์ ์คํํ์ง ์๊ณ virtualenv์ python ์ธํฐํ๋ฆฌํฐ๋ฅผ ์คํํ๊ณ pip ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์์ค๋ก python์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
์ฆ, pip install -r requirements.txt
๋์ python -m pip install -r requirements.txt
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๊ตฐ๊ฐ๊ฐ ์ด๊ฒ์ ํผ๋์ค๋ฝ๊ฒ ์๊ฐํ๋ค๋ฉด:
์ฆ,
pip install -r requirements.txt
๋์python -m pip install -r requirements.txt