์ ๊ธ ํ์ผ ์
๋ฐ์ดํธ๋ ๋งค์ฐ ๋๋ฆด ์ ์์ต๋๋ค. ํ์ค pipenv lock
์ฝ๊ฒ 1๋ถ ์ด์ ๊ฑธ๋ฆฝ๋๋ค.
$ time pipenv lock
Locking [dev-packages] dependenciesโฆ
Locking [packages] dependenciesโฆ
Updated Pipfile.lock (abef76)!
real 1m56.988s
user 0m21.805s
sys 0m2.417s
์ฆ, ํจํค์ง๋ฅผ ์ค์น, ์ ๊ฑฐ ๋๋ ์ ๊ทธ๋ ์ด๋ํด์ผ ํ ๋๋ง๋ค pipenv๊ฐ ์ ๊ธ ํ์ผ ์ ๋ฐ์ดํธ๋ฅผ ๋ง์น ๋๊น์ง 2๋ถ ๋์ ํด์์ ์ทจํด์ผ ํฉ๋๋ค. ์ ๊ทธ๋ฐ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. yarn๊ณผ npm์ ๋น์ทํ ์์ ์ ์ํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ํจ์ฌ ๋ ๋ง์ ์ข ์์ฑ์ด ์๋ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ์๋ ๋ช ์ด ๋ฐ์ ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด ์ฃผ์ ๋ฅผ ์ถ์ ํ๋ ๋ฐ ๋ง์ ๋ฌธ์ ๊ฐ ์์์ ์๊ณ ์์ต๋๋ค. #1785 #1886 #1891 ๋ฐ PR #1896 ์ฐธ์กฐ
npm๊ณผ yarn์ ์ข
์์ฑ์ด ์ผ๋ฐ ํ
์คํธ๋ก ์ง์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ข
์์ฑ ๊ทธ๋ํ๋ฅผ ํ์ธํ๊ธฐ ์ํด ๊ฐ ์์ ํจํค์ง๋ฅผ ์์ ํ ๋ค์ด๋ก๋ํ๊ณ ์คํํ ํ์๊ฐ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. Python ์ข
์์ฑ์ ํด๊ฒฐ ๋ฐ ๊ณ์ฐ์ ์ํด ๊ฐ ํจํค์ง์ ์ค์ ํ์ผ์ ์์ ํ ๋ค์ด๋ก๋ํ๊ณ ์คํํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ ํ์ค์ผ ๋ฟ์ด๊ณ , ์กฐ๊ธ ๋๋ฆฝ๋๋ค. 2๋ถ์ ๊ธฐ๋ค๋ฆด ์ ์๊ฑฐ๋ ์ ์ถฉํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐ๋๋ฉด ์ธ์ ๋ ์ง --skip-lock
์ ๋ฌํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ง๊ฐํฉ๋๋ค.
์ฌ๊ธฐ์์ ์ง๊ธ ์๋ํ๊ณ ์์ผ๋ฉฐ django ์ค์น๊ฐ ์ด๋ฏธ 10๋ถ์ ์งํ ์ค์ ๋๋ค.
ํ ๋ฒ์ ๋ช ๊ฐ๋ฅผ ์๋ํ๊ณ ์ค์นํ๋ฉด ๋๋ฆฌ์ง ๋ง ํ ๋ฒ์ ํ๋์ฉ ์ํํ๋ฉด ์กฐ๊ธ ๋ ๋นจ๋ฆฌ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ฆฐ ๋์์ ์ฌํํ๋ Pipfile์ ์ ๊ณตํ ์ ์๋ค๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
Python ์ข ์์ฑ์ ํด๊ฒฐ ๋ฐ ๊ณ์ฐ์ ์ํด ๊ฐ ํจํค์ง์ ์ค์ ํ์ผ์ ์์ ํ ๋ค์ด๋ก๋ํ๊ณ ์คํํด์ผ ํฉ๋๋ค.
ํจํค์ง์ ์์ฒด Pipfile.lock
๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ฌ์ ํ ๊ทธ๋ฌํฉ๋๊น, ์๋๋ฉด pipenv๊ฐ ์ข
์์ฑ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ฌ์ฉํฉ๋๊น?
pipenv๋ ์์กด์ฑ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ๊ฐ๋ฅํ ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ ๋๊น?
์๋์. Pipenv๋ ์ ํ๋ฆฌ์ผ์ด์ ์ข ์์ฑ ํด๊ฒฐ ๋๊ตฌ์ ๋๋ค. ์ข ์์ฑ์ด ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ์์ Python ํจํค์ง๋ก ์ฌ์ฉ๋๋ฉด ๋ ์ด์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋๋๋ค. ์ข ์์ฑ์ setup.py(๋๋ setup.cfg ๋๋ PyPI์ ์ ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ฒ)์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. ์ ๊ธ ํ์ผ์์ ์ข ์์ฑ์ ๋ก๋ํ๋ ๊ฒ์ ์ข ์์ฑ ์ง์ฅ์ผ๋ก ๊ฐ๋ ํ์คํ ๊ฒฝ๋ก์ด๋ฉฐ ๊ฒฐ์ฝ ๊ทธ๋ ๊ฒ ํ์ง ์์ ๊ฒ์ ๋๋ค.
์ฌ์ ํ ์์ฒญ๋๊ฒ ๋๋ฆฝ๋๋ค
@iddan ์๋ฆผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค, Captain Obvious!
์ฃ์กํฉ๋๋ค. OSS ์ ์ง ๊ด๋ฆฌ์๋ก์ ๋์ด ๋๋ฌธ์ ๋๋๋ก ๋ฌธ์ ๊ฐ ๋ฌด์๋ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋ ผ์๋ฅผ ๋ฐ์ ๋ฌธ์ ๋ผ๋ ์ฌ์ ํ ๊ด๋ จ์ด ์๋ค๋ ์ ์ ๋งํ๊ณ ์ถ์์ต๋๋ค.
์ ์ --skip-lock
@techalchemy ๋ฉ๋ชจ๋ ํ๋ฅญํฉ๋๋ค. ์ด๊ฒ์ ๋ ์ ๊ทผ ๊ฐ๋ฅํ๊ฑฐ๋ ๊ณต๊ฐ๋ ์ต์
์ด์ด์ผ ํฉ๋๋ค. ์ด๋๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ ์ ์์ต๋๊น?
@techalchemy ์ mac pro๋ก 20๋ถ์ด๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์ ์
--skip-lock
@techalchemy ๋ฉ๋ชจ๋ ํ๋ฅญํฉ๋๋ค. ์ด๊ฒ์ ๋ ์ ๊ทผ ๊ฐ๋ฅํ๊ฑฐ๋ ๊ณต๊ฐ๋ ์ต์ ์ด์ด์ผ ํฉ๋๋ค. ์ด๋๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ ์ ์์ต๋๊น?
๋ด๊ฐ ์์งํ๋ ํ, pipenv์ ์๋์ ์ธ ์ด์ ์ ๋น์ ๋ฟ๋ง ์๋๋ผ ๋์ค์ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋ ์ฌ๋์ ์ํด ์ข ์์ฑ์ด ํจ๊ป ์ ์๋ํ ๊ฒ์ด๋ผ๋ ๋ณด์ฅ์ ๋๋ค. ๊ทธ ๋ณด์ฆ์ ์ฐ๋ฌผ์ธ ์ ๊ธ ํ์ผ์ _๊ฐ๋ฐ์๋ฅผ ํฌํจํ์ฌ_ ๋๊ตฌ๋ ์์ํ๊ฑฐ๋ ์ํ๋ ๊ฒ๋ณด๋ค ์ ๋์ ์ผ๋ก ๋ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. #2200 ์ฐธ์กฐ.
๊ทธ๋ฌ๋ pipenv๊ฐ Python ์ปค๋ฎค๋ํฐ์ ์ ์์ ๊ฐ๋ฐ์๋ฅผ ๋ฏธ๋์ ๊ธฐ์ฌ์์๊ฒ ๋ถ๋ด์ ๋ ์ฃผ๋ ์ํฌํ๋ก๋ก ์๋ดํด์ผ ํ๋ ๊ธฐํ๋ ์ดํดํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ ๋ฐฉ๋ฒ ํ์ " ๋จ๊ณ; ๊ทธ๋ฆฌ๊ณ "์ฌ๊ฐํ ํ๋ก์ ํธ ๋ด๋ถ ๋ฌธ์ ๋ฅผ ์ฌ๊ฐํ๊ฒ ๋ง์น๋" ๋จ๊ณ์์ ํฌ๊ธฐํ PR ์์ฑ์์ผ ์ ์๋ ๋ฏธ๋์ ์ ์ง ๊ด๋ฆฌ์๊ฐ ๋์ง ์ ์๋ ์์ด ์ค์ด๋ญ๋๋ค.
--skip-lock
๊ฐ Pipfile์ ์๊ตฌ ํ๋๊ทธ๊ฐ ๋๊ฑฐ๋ pipenv ๊ตฌ์ฑ์ ์ค์ ์ด ๋๋ ๊ฒฝ์ฐ pipenv์ ์ธ์์ ์ฒ์ฒํ "๋ ๋์ pip"์ผ๋ก ๋ฏธ๋๋ฌ์ง๊ณ ์ปค๋ฎค๋ํฐ๊ฐ ๊ฒฐ๊ตญ ์๋ฅํจ์ ๋ฐ๋ผ ์งํ์ ์ผ๋ก ํฌ๋ฏธํด์ง๋ ๋ ๋ค๋ฅธ ๋๋ค๋์ด ๋ ๊ฒ์
๋๋ค. ๋ ํํ์ ์ธ ์์ ํ๊ณ์.
env var ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด _"์ฌ์ฉ์๋ณ ๋ก์ปฌ ๊ตฌ์ฑ, ์๋ชป"_ ์์ญ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ง ์ฌ์ฉํ ์ ์๋๋ก ๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ฉด pipenv๊ฐ ํฌ๊ธฐํ์ง ์๊ณ ์ ๊ธ ํ์ผ ์์ฑ ์๋๊ฐ ๋๋ ค์ง๋ ๋จ๊ณ๋ฅผ ๊ทน๋ณตํ ์ ์์ต๋๋ค. ํจํค์ง ๊ด๋ฆฌ์์ _์๋ฌต์ฑ๋ณด๋ค ๋ช ์์ฑ์ ํฅํ ์ง์ ์ผ๋ก ์ ์ตํ ๋ฌธํ์ ๋ณํ.
Python์ ์์ฒญ๋๊ฒ ๋ฐฉ๋ํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ผ๊ด์ฑ์ ๊ฐ์ํ๋ ์ฌ๋ฌ ์๋๋ฅผ ๊ฑฐ์น ์ญ์ฌ๋ฅผ ๊ฐ์ง ์์ฒญ๋ ์์ฐ์ ๋๋ค. ๋๋ถ๋ถ์ ํ์ค ํจํค์ง๊ฐ ํจ๊ป ์ ์๋ํ๋ค๋ ๊ฒ์ ๋ง์ ์ฌ๋๋ค์ด ์๋ ์ ๊ฑธ์ณ ๊ณ ๋ คํ ์์ฒญ๋ ์์ ์ ๋๋ค. ์ธ์ ๊ฐ๋ ๊ทธ ๋ฉ์ง ๊ธฐ๋ฅ์ด ์น์์ ์ ํ๋ ๋๋ถ๋ถ์ Python ํ๋ก์ ํธ๋ก ํ์ฅ๋ ๊ฒ์ ๋๋ค. stdlib์๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๊ณ ํจ์ฌ ์ ์ ์์ PEP๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฌํ์ ์ํฅ์ ์ผ๋ฐฉ์ ์ผ๋ก ๋ฒํฐ ๊ฒฝํ์ ์ธก์ ํ๊ธฐ ์ด๋ ต์ง๋ง, ์ผ๋ถ ํ์ฌ์ ์ธ์ด ๋ถ๋ง์กฑ ์ค๋ฝ๋ค ์ฐ๋ ๊ธฐ๋ ์ฆ์ ํธ์๋ฅผ ์ํด ๊ฐ๋ ๋ฌด๊ฒฐ์ฑ์ ์์ ... ๊ทธ๋ฆฌ๊ณ ์, ์ฅ์, ๊ทธ๋ค์ ๊ฒ์ ๋๋ค ์ด๋ .
๋ฐ๋ผ์ _yes_๋ ์ ๊ธ ํ์ผ ์์ฑ์ด ๋๋ฆฌ๊ณ _yes_๋ pip install --save
๋ง ์ํ ๋ ๋ต๋ตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์๋
๋์ ์ฝ๋ผ๋ฆฌ๋ฅผ ๋ฒฝ์ฅ์ผ๋ก ์ธ์ด๋๊ฒผ๊ธฐ ๋๋ฌธ์ผ ๋ฟ์
๋๋ค. ์ฐ๋ฆฌ๋ _"๋ด ์ปดํจํฐ์ ์ ๋๋ก ์ค์น"๋์๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ์ข
์์ฑ์ผ๋ก ์ธํ ๊ธฐ๋์ ์๋๊ฐ ์์ผ ์์ง ์๋ค๊ณ ๋ฏฟ์์ต๋๋ค.
Lockfile ์์ฑ์ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋น์ฐํ๊ฒ ์ฌ๊ฒผ๋ ๊ฒ์ ๋ช ์์ ์ผ๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ _only_ ๋๋ฆฝ๋๋ค. ํ์ง๋ง _๋๋ฌธ์_ ์ํ์ง ์๋๋ก ์กฐ์ ํ๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ๋ฏฟ์๋ ์ผ์ ํ๋ค๊ฐ ๋ฌด๋ฆฌํด์ ํ์ ๋ถ๋ฌ๋จ๋ ธ์ต๋๋ค. ๋ฌผ๋ก , ๊ทธ ํ์ ๋ค์๋ ์ฌ์ฉํ์ง ์์์ผ๋ก์จ ๊ณ ํต์ ํผํ ์ ์์ต๋๋ค. ๋๋ ์น์ ๋๋ ๋์ ๊น์ค๋ฅผ ํ ์๋ ์์ต๋๋ค.
๋๋ ์ค๋ pipenv๋ฅผ ์ค์ค๋ก์๊ฒ ํธ๋ฆฌํ๊ฒ ๋ง๋ค์ง ๋ง๋ผ๊ณ ๋ง์ง๋ง์ผ๋ก ๋งํ๊ณ ์ถ์ต๋๋ค. Python ์ปค๋ฎค๋ํฐ๊ฐ ๊น์ค๋ฅผ ์ ๊ฑฐํ ๋ ์ค์ ๋ก ์์ํ๋ ๊ฒ๋ณด๋ค ๋ ์๋ฒฝํ๊ฒ ๊ธฐ๋ฅํ๋ ํ๋ค๋ฆฌ๋ฅผ ๊ฐ์ง ๊ฐํ๊ณ ๊ฑด๊ฐํ ๋ชธ์ผ๋ก ๋ฐ์ ํ๋ ๋์ ๊ณ ํต์ ๊ฒช์ต๋๋ค. Python 3์ผ๋ก ๋ง๋ค์์ต๋๋ค. stdlib์์ ์ข ์์ฑ ๊ด๋ฆฌ๋ก ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
๋ด ์ปดํจํฐ์์ ์ ๊ธ ํ์ผ์ ๋ง๋๋ ๋ฐ 38๋ถ์ด ๊ฑธ๋ ธ์ต๋๋ค. Windows 10 ์คํ ๋ฐ Python 3.7 ์ฌ์ฉ
numpy์ ๋ฒ ๊ฐ๋ง ์ด๋ฏธ ์ค์น๋์ด ์๊ณ numa๋ฅผ ์ค์นํ๋ ๋ฐ <1์ด, ์ ๊ทธ๋ ๋ฐ 25๋ถ์ด ๊ฑธ๋ ธ์ต๋๋ค. pipenv๋ ์ ๊ธ ์ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ๋ก ์ปดํ์ผํฉ๋๊น ์๋๋ฉด ์ด๋ป๊ฒ ์๋ํฉ๋๊น?
์ฐธ๊ณ ๋ก ์๊ตฌ ๊ฑด๋๋ฐ๊ธฐ ์ ๊ธ์ ๋๊ตฐ๊ฐ๊ฐ ํด๋ฆญ ์ค์ ์ธ auto_envvar_prefix
์ค์์น๋ฅผ ์ ํํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ์ ๋ 100% ํต์ฌ ๊ธฐ๋ฅ์ ์ง์คํด์ ์์ง ์ด๊ฒ์ ๋ณผ ๊ธฐํ๊ฐ ์์์ง๋ง ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
TLDR; ์ผ๋ฐ์ ์ธ pipenv install
ํธ์ถ: ์๊ฐ : 144.82 ์ค์ 33.68 ์ฌ์ฉ์ 5.77 sys. --skip-lock
: ์๊ฐ : 4.54 ์ค์ 5.33 ์ฌ์ฉ์ 0.87 ์์คํ
Pandas-datareader ์ค์น๋ ์ฒซ ๋ฒ์งธ ์๋์์ ์คํจํฉ๋๋ค. lock
์ค๋จ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ด ๋ค๋ฅธ ํจํค์ง์์ ๋ณด๊ณ ์๋ ๋ฌธ์ ์
๋๊น?
๋ฒ์ 2018.11.26 ์ฌ์ฉ
$ pipenv --version
pipenv, version 2018.11.26
requirements.txt
sklearn
pandas
numpy
matplotlib
statsmodels
์ผ๋ฐ์ ์ธ pipenv install
ํธ์ถ์
๋๋ค. time
(BSD)๋ฅผ ์ฌ์ฉํ ์๊ฐ ์ ํ ์คํ.
๊ฒฐ๊ณผ : 144.82 ์ค์ 33.68 ์ฌ์ฉ์ 5.77 ์์คํ
$ time pipenv install -r requirements.txt
Requirements file provided! Importing into Pipfileโฆ
Pipfile.lock (0fdb67) out of date, updating to (a65489)โฆ
Locking [dev-packages] dependenciesโฆ
Locking [packages] dependenciesโฆ
โ Success!
Updated Pipfile.lock (0fdb67)!
Installing dependencies from Pipfile.lock (0fdb67)โฆ
๐
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 15/15 โ 00:00:04
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
144.82 real 33.68 user 5.77 sys
ํธ์ถ w\ --skip-lock
๊ฒฐ๊ณผ : 4.54 ์ค์ 5.33 ์ฌ์ฉ์ 0.87 ์์คํ
$ time pipenv install -r requirements.txt --skip-lock
Requirements file provided! Importing into Pipfileโฆ
Installing dependencies from Pipfileโฆ
๐
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 6/6 โ 00:00:01
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
4.54 real 5.33 user 0.87 sys
https://github.com/pandas-dev/pandas/ ๊ฐ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๊น? ๊ทธ๊ฒ์ ๋์๊ฒ๋ ์๊ฐ์ ๊ณตํต์ ์ด๋ค.
pytest
๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ง๋ง :\
๋ด ์ปดํจํฐ์์๋ ์๋ฃ๋์ง ์์ต๋๋ค.
Installing pandasโฆ
Adding pandas to Pipfile's [packages]โฆ
Installation Succeeded
Pipfile.lock not found, creatingโฆ
Locking [dev-packages] dependenciesโฆ
Locking [packages] dependenciesโฆ
Traceback (most recent call last):
File "c:\python36\lib\site-packages\pipenv\vendor\pexpect\expect.py", line 109, in expect_loop
return self.timeout()
File "c:\python36\lib\site-packages\pipenv\vendor\pexpect\expect.py", line 82, in timeout
raise TIMEOUT(msg)
pexpect.exceptions.TIMEOUT: <pexpect.popen_spawn.PopenSpawn object at 0x00000292ADCCCDD8>
searcher: searcher_re:
0: re.compile('\n')
@black-snow ๋ค๋ฅธ ์์์ ์๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ฌด ๊น์ด ๋ค์ด๊ฐ์ง ์์ผ๋ฉด pexpect(๋ํํ CLI ํ๋ก๊ทธ๋จ๊ณผ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ธํฐํ์ด์ฑํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ์ฌ์ฉํ์ฌ pipenv๊ฐ ์คํ๋๊ณ ์๋ ์ ธ์ ๊ฐ์งํ๊ณ ์ง์ฐ๋ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. pexpect๋ ๊ทธ๋ฐ ์ผ์ ๋ํด ๊ณผ๋ํ๊ฒ ๋ณด์ด์ง๋ง ์ ์ฒด ์ปจํ ์คํธ๋ฅผ ์์ง ๋ชปํฉ๋๋ค.
@Y4Kman ์กฐ์ธ ๊ฐ์ฌํฉ๋๋ค. pipenv๋ ๋์ผํ ์ฐ๋ถํฌ ๋ฐ bash ๋ฒ์ ์ ์ฌ์ฉํ๋ ๋ค๋ฅธ PC์์ ์ ์๋ํฉ๋๋ค ...
pipfile์ด ์ ๊ธธ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ด๊ฒ์ ์ฝ์ผ์ญ์์ค...:) ํด๊ฒฐ์ฑ ์ด ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
Python ํจํค์ง deps๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ ์บ์ํ๊ณ ๊ธฐ๊ณ ์นํ์ ์ธ ํ์์ผ๋ก ๋ฐฐํฌํ๋ ค๋ฉด ์ผ์ข ์ API๊ฐ ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ ๋ ์ด์ ์ ์ฒด ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ๊ตฌ๋ฌธ ๋ถ์ํ ํ์๊ฐ ์์ต๋๋ค.
๋๋ ๋ฒ๋ค๋ฌ์ ๋ฃจ๋น ๋ณด์์ด ๊ทธ๋ฐ ๊ฒ์ ์ ์งํ๊ณ ์ฌ์ฉํ๋ค๊ณ ๋ฏฟ์ต๋๋ค.
Java์๋ ํจํค์ง ์ข ์์ฑ๊ณผ ํจํค์ง์ ๋ํ ๊ธฐํ ์ ๋ณด๊ฐ ํฌํจ๋ POM ํ์ผ(XML)๋ ์์ต๋๋ค. ์ปดํ์ผ๋ JAR๊ณผ ๋ณ๋๋ก ์ ๋ก๋๋ฉ๋๋ค.
๋ชจ๋ ์ต์ ํจํค์ง ๊ด๋ฆฌ์์๋ ๋ณ๋์ ๋ฉํ ํ์ผ(npm/yarn, ์๊ณก๊ฐ, gradle/maven, ํ๋ฌผ, ruby โโgems/bundler ๋ฑ)์ด ์์ต๋๋ค.
๊ด๋ จ ๋ฌธ์ :
https://github.com/pypa/warehouse/issues/474
์ ์ฒด ๋ฒ๋ค์ ๋ค์ด๋ก๋ํ์ง ์๊ณ ๋ PyPi์์ ์ข ์์ฑ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค(PEP 426์ ๋์ฒดํ PEP 566 ์ฐธ์กฐ).
package_name = 'Django'
PYPI_API_URL = 'https://pypi.python.org/pypi/{package_name}/json'
package_details_url = PYPI_API_URL.format(package_name=package_name)
response = requests.get(package_details_url)
data = json.loads(response.content)
data['info'].get('requires_dist')
data['info'].get('requires')
data['info'].get('setup_requires')
data['info'].get('test_requires')
data['info'].get('install_requires')
@techalchemy ์ ๋๊ธ ๋ณด์ จ๋์?
์ด๊ฒ์ ๊ฝค ์ผ๊ด๋๊ฒ ๋ฐ์ํ๊ณ ์์ต๋๋ค. ๋ณธ์ง์ ์ผ๋ก pipenv
๋ง์์ ๋์๋ค๋๋ฉฐ ๋ฌด์ธ๊ฐ๋ฅผ "์ ๊ทธ๋" ๊ฒ์
๋๋ค. ์ด ๋ฌธ์ ๊ฐ ์ข
๋ฃ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
--skip-lock
๊ฐ ๊ฐ์ผ ํ ๊ธธ์์ ์ดํดํ์ง๋ง "์ค์น"๊ฐ ๋ช ์ด๊ฐ ๊ฑธ๋ฆฌ๊ณ "์ ๊ธ"์ด ์์ํ ๊ฑธ๋ฆฌ๋ ์ด์ ๋ ์ ํ ๋ช
ํํ์ง ์์ต๋๋ค. /์
๋ฐ์ดํธ ๋ก๊ทธ: ํ์ฌ ์ํ๋ก๋ while True
์์ํ ๊ฐํ ์๋์ง์กฐ์ฐจ ๋ช
ํํ์ง ์์ต๋๋ค...
์ ์ด๋ ๋ด๊ฐ ๋ญ๊ฐ ์๋ชปํ๊ณ ์๋์ง ์๋๋ฉด pipenv์ "๊ธฐ๋ฅ"์ธ์ง ์๊ณ ์ถ์ต๋๋ค.
์ฐ๋ฆฌ ํ๋ก์ ํธ์์ pipenv lock
๋ ๋๋ฌด ๋๋ฆฝ๋๋ค. ๊ทธ๊ฒ์ ํ์คํ ์ฐ๋ฆฌ์ ์ ์์ ์ธ ์ฌ์ฉ์ ์ํฅ์ ๋ฏธ์ณค์ต๋๋ค. ์ ํจํค์ง๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ด์ ์ฐ๋ฆฌ์๊ฒ ํฐ ๊ณ ํต์ด ๋ฉ๋๋ค. ์ด์จ๋ ์ด ๋์์ ๋๋ฒ๊น
ํ ์ ์์ต๋๊น?
PyTorch๋ฅผ ์ค์นํ๋ ค๊ณ ํ๋๋ฐ ์ ๊ทธ๋ ๋ฐ 20๋ถ์ด ๊ฑธ๋ ธ๋ค๊ฐ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Installing initially failed dependenciesโฆ
[pipenv.exceptions.InstallError]: File "/usr/local/lib/python3.6/dist-packages/pipenv/core.py", line 1992, in do_install
[pipenv.exceptions.InstallError]: skip_lock=skip_lock,
[pipenv.exceptions.InstallError]: File "/usr/local/lib/python3.6/dist-packages/pipenv/core.py", line 1253, in do_init
[pipenv.exceptions.InstallError]: pypi_mirror=pypi_mirror,
[pipenv.exceptions.InstallError]: File "/usr/local/lib/python3.6/dist-packages/pipenv/core.py", line 859, in do_install_dependencies
[pipenv.exceptions.InstallError]: retry_list, procs, failed_deps_queue, requirements_dir, **install_kwargs
[pipenv.exceptions.InstallError]: File "/usr/local/lib/python3.6/dist-packages/pipenv/core.py", line 763, in batch_install
[pipenv.exceptions.InstallError]: _cleanup_procs(procs, not blocking, failed_deps_queue, retry=retry)
[pipenv.exceptions.InstallError]: File "/usr/local/lib/python3.6/dist-packages/pipenv/core.py", line 681, in _cleanup_procs
[pipenv.exceptions.InstallError]: raise exceptions.InstallError(c.dep.name, extra=err_lines)
[pipenv.exceptions.InstallError]: ['Collecting pytorch==1.0.2 (from -r /tmp/pipenv-pb00kf8t-requirements/pipenv-vae35p2d-requirement.txt (line 1))', ' Using cached https://files.pythonhosted.org/packages/ee/67/f403d4ae6e9cd74b546ee88cccdb29b8415a9c1b3d80aebeb20c9ea91d96/pytorch-1.0.2.tar.gz', 'Building wheels for collected packages: pytorch', ' Building wheel for pytorch (setup.py): started', " Building wheel for pytorch (setup.py): finished with status 'error'", ' Running setup.py clean for pytorch', 'Failed to build pytorch', 'Installing collected packages: pytorch', ' Running setup.py install for pytorch: started', " Running setup.py install for pytorch: finished with status 'error'"]
[pipenv.exceptions.InstallError]: ['ERROR: Complete output from command /home/alex/.local/share/virtualenvs/pytorch-umelu-tG/bin/python3 -u -c \'import setuptools, tokenize;__file__=\'"\'"\'/tmp/pip-install-hix3yz6v/pytorch/setup.py\'"\'"\';f=getattr(tokenize, \'"\'"\'open\'"\'"\', open)(__file__);code=f.read().replace(\'"\'"\'\\r\\n\'"\'"\', \'"\'"\'\\n\'"\'"\');f.close();exec(compile(code, __file__, \'"\'"\'exec\'"\'"\'))\' bdist_wheel -d /tmp/pip-wheel-f_h8w1pz --python-tag cp36:', ' ERROR: Traceback (most recent call last):', ' File "<string>", line 1, in <module>', ' File "/tmp/pip-install-hix3yz6v/pytorch/setup.py", line 15, in <module>', ' raise Exception(message)', ' Exception: You tried to install "pytorch". The package named for PyTorch is "torch"', ' ----------------------------------------', ' ERROR: Failed building wheel for pytorch', ' ERROR: Complete output from command /home/alex/.local/share/virtualenvs/pytorch-umelu-tG/bin/python3 -u -c \'import setuptools, tokenize;__file__=\'"\'"\'/tmp/pip-install-hix3yz6v/pytorch/setup.py\'"\'"\';f=getattr(tokenize, \'"\'"\'open\'"\'"\', open)(__file__);code=f.read().replace(\'"\'"\'\\r\\n\'"\'"\', \'"\'"\'\\n\'"\'"\');f.close();exec(compile(code, __file__, \'"\'"\'exec\'"\'"\'))\' install --record /tmp/pip-record-xr7o93_5/install-record.txt --single-version-externally-managed --compile --install-headers /home/alex/.local/share/virtualenvs/pytorch-umelu-tG/include/site/python3.6/pytorch:', ' ERROR: Traceback (most recent call last):', ' File "<string>", line 1, in <module>', ' File "/tmp/pip-install-hix3yz6v/pytorch/setup.py", line 11, in <module>', ' raise Exception(message)', ' Exception: You tried to install "pytorch". The package named for PyTorch is "torch"', ' ----------------------------------------', 'ERROR: Command "/home/alex/.local/share/virtualenvs/pytorch-umelu-tG/bin/python3 -u -c \'import setuptools, tokenize;__file__=\'"\'"\'/tmp/pip-install-hix3yz6v/pytorch/setup.py\'"\'"\';f=getattr(tokenize, \'"\'"\'open\'"\'"\', open)(__file__);code=f.read().replace(\'"\'"\'\\r\\n\'"\'"\', \'"\'"\'\\n\'"\'"\');f.close();exec(compile(code, __file__, \'"\'"\'exec\'"\'"\'))\' install --record /tmp/pip-record-xr7o93_5/install-record.txt --single-version-externally-managed --compile --install-headers /home/alex/.local/share/virtualenvs/pytorch-umelu-tG/include/site/python3.6/pytorch" failed with error code 1 in /tmp/pip-install-hix3yz6v/pytorch/']
ERROR: ERROR: Package installation failed...
์ค๋ฅ๊ฐ ์ฝํ์ง ์์์ผ๋ฉฐ ๋ฌด์์ด ์๋ชป๋์๋์ง ๋ชจ๋ฆ ๋๋ค. ํ๊ฒฝ์์ pip๋ก ์ค์นํ๋ฉด ์ ์๋ํฉ๋๋ค! ์ด๊ฒ์ ์ ๋ง๋ก ์ผ ์คํ ํผ์ ๋๋ค. requirements.txt๋ก ๋์๊ฐ๊ธฐ...
์ด๊ฒ์ ๋ด๊ฐ ์ง๊ธ ์ฌ์ฉํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
export PIPENV_SKIP_LOCK=true
๊ทธ๋ฌ๋ฉด pipenv install foo
๊ฐ ์ ๊ธฐ์ง ์๊ณ ์๊ฐ์ด ์์ ๋ pipenv lock
๋ฅผ ์คํํ์ฌ ์๋์ผ๋ก ์ ๊ธ ์ ์์ต๋๋ค.
@awhillas ๋ง์ง๋ง ์ค์๋ ํ์ํ ๋ชจ๋ ๊ฒ์ด ๋์ ์์ต๋๋ค.
"pytorch"๋ฅผ ์ค์นํ๋ ค๊ณ ํ์ต๋๋ค. PyTorch์ ํจํค์ง ์ด๋ฆ์ "torch"์ ๋๋ค.
์ข ์์ฑ์ ์ ๊ทธ๋ ๊ฒ์ด ์ค์ํ๋ฏ๋ก "์ ๊ธ ๊ฑด๋๋ฐ๊ธฐ"๊ฐ ์ง์์ ์ธ ์๋ฃจ์ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋์์ "์ ๊ธ ์ข ์์ฑ"(ํ๋์์ ์๋ฐํ ์ ์๋ ๋ชจ๋ ๊ฒ)์ด ํ์ฌ์ ๊ฐ์ด ์ต๋๋ก ์ต์ ํ๋์ด ์๊ณ ๊ธฐ๋ฅ์ ์ผ๋ก ์๋ฃํ๋ ๋ฐ ๋ช ๋ถ ๋๋ ๋ช ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๋ ๊ฒ์ ๋จ์ํ ๊ตฌ๋งคํ์ง ์์ต๋๋ค. ์ค์ ๋ก ๋ด pipenv ์ ๊ธ์ ์คํจํ๊ธฐ ์ ์ 5๊ฐ์ง ์ข ์์ฑ์ด ์๋ Pipfile์์ ๋ช ๋ถ ๋์ ์คํ๋์์ผ๋ฉฐ(ํ๋จ์ ์คํ์ด ์ฐ๊ฒฐ๋จ) ๊ทธ ๋์ ์ฌ์ฉ ๊ฐ๋ฅํ CPU์ 10-15%์ ์ฝ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ง ์ฌ์ฉํ์ต๋๋ค.
๋ณ๋ชฉ ํ์์ ํ์ ํ๊ณ ํ์ ํ๊ธฐ ์ํด ์ต์ํ ๊ทธ๋ฃน์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ผ ์ ์์ต๋๊น? ์ด ํ๋ก์ธ์ค๋ฅผ ํฉ๋ฆฌ์ ์ธ ๋ฐํ์์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ด๋ฆฌ์์ ๋ฎ์ ๊ต์ํ ๊ณผ์ผ์ด ์๋ค๋ ๋๋์ด ๋ญ๋๋ค.
pipenv version 2018.11.26
ํํ์ผ์ ๊ฒฝ์ฐ:
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
[dev-packages]
keras = "*"
tensorflow = "~=1.13"
setuptools = "*"
wheel = "*"
twine = "*"
[requires]
python_version = ">=3.6"
Pipfile.lock (63b275) out of date, updating to (5e165c)โฆ
Locking [dev-packages] dependenciesโฆ
Traceback (most recent call last):
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/pexpect/expect.py", line 109, in expect_loop
return self.timeout()
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/pexpect/expect.py", line 82, in timeout
raise TIMEOUT(msg)
pexpect.exceptions.TIMEOUT: <pexpect.popen_spawn.PopenSpawn object at 0x105a17210>
searcher: searcher_re:
0: re.compile('\n')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/bin/pipenv", line 11, in <module>
load_entry_point('pipenv==2018.11.26', 'console_scripts', 'pipenv')()
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 764, in __call__
return self.main(*args, **kwargs)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 717, in main
rv = self.invoke(ctx)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/click/decorators.py", line 64, in new_func
return ctx.invoke(f, obj, *args, **kwargs)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/click/decorators.py", line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/cli/command.py", line 254, in install
editable_packages=state.installstate.editables,
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/core.py", line 1992, in do_install
skip_lock=skip_lock,
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/core.py", line 1221, in do_init
pypi_mirror=pypi_mirror,
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/core.py", line 1068, in do_lock
lockfile=lockfile
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/utils.py", line 649, in venv_resolve_deps
c = resolve(cmd, sp)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/utils.py", line 517, in resolve
result = c.expect(u"\n", timeout=environments.PIPENV_INSTALL_TIMEOUT)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/delegator.py", line 215, in expect
self.subprocess.expect(pattern=pattern, timeout=timeout)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/pexpect/spawnbase.py", line 341, in expect
timeout, searchwindowsize, async_)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/pexpect/spawnbase.py", line 369, in expect_list
return exp.expect_loop(timeout)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/pexpect/expect.py", line 119, in expect_loop
return self.timeout(e)
File "/usr/local/Cellar/pipenv/2018.11.26_2/libexec/lib/python3.7/site-packages/pipenv/vendor/pexpect/expect.py", line 82, in timeout
raise TIMEOUT(msg)
pexpect.exceptions.TIMEOUT: <pexpect.popen_spawn.PopenSpawn object at 0x105a17210>
searcher: searcher_re:
0: re.compile('\n')
์ด์ ์๊ฒฌ์ ๋ํ ๋ถ๋ก์ผ๋ก pip lock
๋ณ๋๋ก ์คํํ๋ ๋ฐ๋ pip install --skip-lock
์ฒ์ ์คํํ ํ ํฉ๋ฆฌ์ ์ธ ์๊ฐ(~15์ด)์ด ์์๋์์ต๋๋ค. ๋ฐ๋ผ์ ์ค์น ํ ์ ๊ธ ํธ์ถ์ด ์ค๋๋์๊ฑฐ๋ ๊ฒฐํจ์ด ์์ ์ ์์ต๋๋ค. :)
์ฐธ๊ณ ๋ก tensorflow๊ฐ pipenv๋ฅผ ํ๋กํ์ผ๋งํ๋ ๋ฐ ๋์์ด ๋๋ ๊ฒฝ์ฐ ๋๋ฆฐ/์๊ฐ ์ด๊ณผ ์ ๊ธ์ ์์ธ์ด๋ผ๋ ๊ฒ์ ์์์ต๋๋ค! (์ฌ์ ํ ์ด๊ฒ์ pipenv ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ญ์์ค ...)
Tensorflow๋ pipenv๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ชจ์๋ ๋๊ตฌ๋ก ๋ง๋ค ์ ์๋ ๋ง์ ํจํค์ง ์ค ํ๋์ ๋๋ค. ๊ทธ๋๋ ๊ทธ๋ฃน ํ๋กํ์ผ๋ง ์ ์์ด ๋ง์์ ๋ญ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์์ํ๋ ๊ฒ์ด ์ข์ ์์ด๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ค์ ๋ฐ๋ณตํ๊ธฐ ์ํด PEP 566์ ์ ์ฒด ์์ค๋ฅผ ๋ก๋ํ์ง ์๊ณ ์ข ์์ฑ ์ด๊ฑฐ(pypi๋ฅผ ํตํด)๋ฅผ ํ์ฑํํ์ต๋๋ค. ์ด๋ ๋์์ด ๋ ์ ์์ต๋๋ค: https://github.com/pypa/pipenv/issues/1914#issuecomment -457965038
@brandonrobertz ๋ด๊ฐ ๋ณธ ๋ฐ๋ก๋ ์ข ์์ฑ์ ๋ชจ๋ ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ๋ ๋ฐ ๊ฐ์ฅ ๋ง์ ์๊ฐ์ด ์์๋ฉ๋๋ค. ์ด ๋ํ ์ด์ ์ ํ์ธ๋์์ต๋๋ค.
์ด๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ:
Pipfile
๋ง๋ค๊ณ ์ ๊ธ์ด ํ์ฑํ๋ ์ํ์์ scipy
(์:)๋ฅผ ์ค์นํด ๋ณด์ธ์.Pipfile.lock
์ ๊ฑฐpipenv lock
- ๋ชจ๋ ํจํค์ง๊ฐ ์ด๋ฏธ ๋ค์ด๋ก๋๋๊ณ ์ผ๋ฐ์ ์ผ๋ก ~/.cache/pipenv
์๋ Pipenv ์บ์์ ๋ณด๊ด๋๊ธฐ ๋๋ฌธ์ ์ง๊ธ ์ ๊ทธ๋ ๋ฐ ์๊ฐ์ด ๊ฑฐ์ ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค(๋ด ์ปดํจํฐ์์ 6์ด).๋ค์์ ์ด๊ฒ์ ํ ์คํธํ๋ ๋ฐ ์ฌ์ฉํ Dockerfile์ ๋๋ค.
FROM python:3.6
ENV WORKDIR=/work/
WORKDIR /work/
RUN python3 -m pip install --upgrade pip
RUN python3 -m pip install pipenv
RUN PIPENV_SKIP_LOCK=true pipenv install scipy
RUN date
RUN pipenv lock
RUN date
RUN rm Pipfile.lock
RUN pipenv lock
RUN date
@shtratos ๋ค, ๊ทธ๊ฑด ๋ง์ด ๋๋ฉฐ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ด ๋ฌธ์ ์ค๋ ๋์์ ์ ์ํ์ต๋๋ค. ์ข ์์ฑ์ ๋ค์ด๋ก๋ํ๊ณ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค. ์ด๋ฌํ ๋จ๊ณ ์ค ์ผ๋ถ๋ pypi ์ข ์์ฑ API์์ ๊ฐ์ ธ์ ์ ๊ฑฐํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ ํ์ง์ด ์ข์ง ์๊ณ ์๋ชป๋ ๊ดํ(setup.py ๋๋ requirements.txt๋ฅผ ์ฌ์ฉํ์ง ์์)์ผ๋ก ์ธํด ์๋ํ์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฃผ์ ์๋ฐ์ ์ค ์ผ๋ถ๋ ๋งค์ฐ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(tensorflow, numpy)์ธ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ์ด๋ฅผ ๋งค์ฐ ๋๋ฆฐ ํ๋ก์ธ์ค๋ก ํด๋ฐฑํ์ฌ ๊ตฌํํ๋ ๊ฒ์ด ์ข์ ๋ฐฉ๋ฒ์ผ ์ ์์ต๋๋ค.
๊ทธ ์ฝ๋๋ฅผ ์ด๋์์ ์ฐพ์ ์ ์๋์ง ์๋ ค์ฃผ์ค ์ ์์ต๋๊น? ๋๋ ํฌํฌ์์ ๊ทธ๊ฒ์ ๋ณ๋ ฌํํ๋ ๋ฐ ์ฐ๋ฅผ ์ ์์ต๋๋ค.
https://github.com/pandas-dev/pandas/ ๊ฐ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๊น? ๊ทธ๊ฒ์ ๋์๊ฒ๋ ์๊ฐ์ ๊ณตํต์ ์ด๋ค.
pytest
๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ง๋ง :\
๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์์ต๋๋ค. ๋ด ์ปดํจํฐ์์ ์ ์๋ํฉ๋๋ค. ๋ฌธ์ ๋ ๊ทธ๋ณด๋ค ๋ ์ผ๋ฐ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ pylint์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋จ์ํ pipenv install pylint
๋ฅผ ์คํํ ๋ ํญ์ ์ ๊ธ ์ํ์์ ๋ฉ์ถฅ๋๋ค. https://github.com/pypa/pipenv/issues/2284#issuecomment -569457752 ์ฐธ์กฐ
๋ด ๋ชจ๋ ํ๋ก์ ํธ์์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์์ธ์ pylint์ธ ๊ฒ ๊ฐ์ต๋๋ค.
Pipenv(pip)๋ ์ฑ๊ณต์ ์ผ๋ก ์ค์นํ ์ ์์ง๋ง ์ ๊ธ์ ์์ํ ๊ฑธ๋ฆฝ๋๋ค!
pipenv, version 2018.11.26
์ต์ํ์ ์์ ์
djbrown@DESKTOP-65P6D75:~$ mkdir test djbrown@DESKTOP-65P6D75:~$ cd test djbrown@DESKTOP-65P6D75:~/test$ pipenv install --dev pylint --verbose Creating a virtualenv for this projectโฆ Pipfile: /home/djbrown/test/Pipfile Using /usr/bin/python3 (3.6.9) to create virtualenvโฆ โ ธ Creating virtual environment...Already using interpreter /usr/bin/python3 Using base prefix '/usr' New python executable in /home/djbrown/.local/share/virtualenvs/test-PW-auWy_/bin/python3 Also creating executable in /home/djbrown/.local/share/virtualenvs/test-PW-auWy_/bin/python Installing setuptools, pip, wheel...done. โ Successfully created virtual environment! Virtualenv location: /home/djbrown/.local/share/virtualenvs/test-PW-auWy_ Creating a Pipfile for this projectโฆ Installing pylintโฆ โ Installing...Installing 'pylint' $ ['/home/djbrown/.local/share/virtualenvs/test-PW-auWy_/bin/pip', 'install', '--verbose', '--upgrade', 'pylint', '-i', 'https://pypi.org/simple'] Adding pylint to Pipfile's [dev-packages]โฆ โ Installation Succeeded Pipfile.lock not found, creatingโฆ Locking [dev-packages] dependenciesโฆ โ Locking...
์ฐ๋ฆฌ๋ ์ด ์ฃผ์ ๋ฅผ ์ถ์ ํ๋ ๋ฐ ๋ง์ ๋ฌธ์ ๊ฐ ์์์ ์๊ณ ์์ต๋๋ค. #1785 #1886 #1891 ๋ฐ PR #1896 ์ฐธ์กฐ
npm๊ณผ yarn์ ์ข ์์ฑ์ด ์ผ๋ฐ ํ ์คํธ๋ก ์ง์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ข ์์ฑ ๊ทธ๋ํ๋ฅผ ํ์ธํ๊ธฐ ์ํด ๊ฐ ์์ ํจํค์ง๋ฅผ ์์ ํ ๋ค์ด๋ก๋ํ๊ณ ์คํํ ํ์๊ฐ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. Python ์ข ์์ฑ์ ํด๊ฒฐ ๋ฐ ๊ณ์ฐ์ ์ํด ๊ฐ ํจํค์ง์ ์ค์ ํ์ผ์ ์์ ํ ๋ค์ด๋ก๋ํ๊ณ ์คํํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ ํ์ค์ผ ๋ฟ์ด๊ณ , ์กฐ๊ธ ๋๋ฆฝ๋๋ค. 2๋ถ์ ๊ธฐ๋ค๋ฆด ์ ์๊ฑฐ๋ ์ ์ถฉํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐ๋๋ฉด ์ธ์ ๋ ์ง
--skip-lock
์ ๋ฌํ ์ ์์ต๋๋ค.๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ง๊ฐํฉ๋๋ค.
๋ค๋ฅธ 4๊ฐ ์ค 3๊ฐ๋ ํ์ฌ ์ข ๋ฃ๋์๊ณ ๋๋จธ์ง ํ๋๋ 2018๋ ์ดํ๋ก ์๋ฌด๋ฐ ํ๋์ด ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ฌ์ ํ ์ง์๋๋ฏ๋ก ๋ค์ ์ฌ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ผ๊น์?
Python ์ข ์์ฑ์ ํด๊ฒฐ ๋ฐ ๊ณ์ฐ์ ์ํด ๊ฐ ํจํค์ง์ ์ค์ ํ์ผ์ ์์ ํ ๋ค์ด๋ก๋ํ๊ณ ์คํํด์ผ ํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋ฐํด์ ๋ํด ์ฌ์ ํ ์ฌ์ค์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ด๋ ๊ฒ์ด ์ง๊ธ ํจํค์ง์ ๋๋ถ๋ถ์ด์ด์ผ ํฉ๋๊น?
๋๋ ์ ์ด๋ ๋งค๋ฒ dlib์ฉ ํ ์ ๋ง๋ค์ด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ด๋ ๋์ฐํฉ๋๋ค.
์ข ์์ฑ์ ํด๊ฒฐํ๋ ํ๋ก์ธ์ค๋ ํธ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋งค๋ฒ ํด๋ผ์ด์ธํธ์์ ๋ค๋ฅธ ์๊ฒฉ ์กฐํ๊ฐ ํ์ํ๋๋ผ๋ ํจํค์ง ๋ฒ์ ๋ณ๋ก ์ด๋๊ฐ์ ์บ์๋์ด์ผ ํฉ๋๋ค(๊ทธ๋ ์ง ์์์ผ ํฉ๋๋ค. ). ์๋ฅผ ๋ค์ด ํจํค์ง ์ ์ฅ์๋ ํด๊ฒฐ๋ dep ํธ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ ์ฅํ ์ ์์ต๋๋ค. ์บ์๋ ํด๊ฒฐ๋ dep ํธ๋ฆฌ์ ๋ํ ์ถ๊ฐ ๋คํธ์ํฌ ์ ์ค์ ์ ์ฒด ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์ปดํจํ ํ๋ ๊ฒ๋ณด๋ค ํญ์ ๋น ๋ฆ ๋๋ค.
FWIW ๋ชจ๋ ํ๋ก์ ํธ์์ pipenv๋ฅผ ์ ๊ฑฐํ์ต๋๋ค(์ด๊ฒ์ด ์ฃผ๋ ์ด์ ์ค ํ๋์ด๋ฉฐ ๋ค๋ฅธ ๊ฒ๋ ์์ต๋๋ค).
virtualenv
+ pip
( requirements.txt
) ์ด์ Prod ๋ฐฐํฌ์์๋ ๊ฝค ์ ์๋ํฉ๋๋ค. ์ด์จ๋ ์์ฆ์๋ ์์ ํ ํํ์ ์ปจํ
์ด๋๋ฅผ ๋ฐฐํฌํฉ๋๋ค. ์ค์ ๋ก pipenv์ ๋ค์ด๊ฐ ํ์๋ ๋ ์ด์ ์์ ์ ๋ณผ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด์ด์ฃผ์ธ์.
๊ทธ๋ ์ง ์์ผ๋ฉด pipenv๋ ์ฐธ์กฐ ํจํค์ง ๋๊ตฌ๊ฐ ๋ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
pipfile์ด ์ ๊ธธ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ด๊ฒ์ ์ฝ์ผ์ญ์์ค...:) ํด๊ฒฐ์ฑ ์ด ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.