Pipenv: ์ž ๊ธˆ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 04์›” 05์ผ  ยท  47์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pypa/pipenv

์ž ๊ธˆ ํŒŒ์ผ ์—…๋ฐ์ดํŠธ๋Š” ๋งค์šฐ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ 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์€ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ํ›จ์”ฌ ๋” ๋งŽ์€ ์ข…์†์„ฑ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ์—๋„ ๋ช‡ ์ดˆ ๋ฐ–์— ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

pipfile์ด ์ž ๊ธธ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ด๊ฒƒ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค...:) ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  47 ๋Œ“๊ธ€

์šฐ๋ฆฌ๋Š” ์ด ์ฃผ์ œ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. #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 (์˜ˆ:)๋ฅผ ์„ค์น˜ํ•ด ๋ณด์„ธ์š”.
  • ์ž ๊ธˆ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค. (์ œ ์ปดํ“จํ„ฐ์—์„œ๋Š” ์•ฝ 5๋ถ„ ์ •๋„ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.)
  • 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๋Š” ์ฐธ์กฐ ํŒจํ‚ค์ง• ๋„๊ตฌ๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰