<p>pipenv ์„ค์น˜๊ฐ€ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค.</p>

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

ํ•˜๋‚˜์˜ ์ข…์†์„ฑ์„ ๋ณ€๊ฒฝ pipenv install ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ SSD๊ฐ€ ์žˆ๋Š” Windows 10 ์‹œ์Šคํ…œ์—์„œ ์•ฝ 5๋ถ„ ์ •๋„ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์€ Locking [packages] dependencies... ๋‚ด๋ถ€์—์„œ ์†Œ๋น„๋ฉ๋‹ˆ๋‹ค.

์ด ๋‹จ๊ณ„์—์„œ 2์ฐจ ๋˜๋Š” ๋” ๋‚˜์œ ๋ณต์žก์„ฑ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

์•„๋ž˜์— ๋Œ€๋ถ€๋ถ„์˜ pipfile์„ ํฌํ•จํ–ˆ์ง€๋งŒ ์ผ๋ถ€ ๊ฐœ์ธ repo ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[packages]
alembic = "==0.8.4"
amqp = "==1.4.7"
analytics-python = "==1.2.5"
anyjson = "==0.3.3"
billiard = "==3.3.0.20"
braintree = "==3.20.0"
celery = "==3.1.18"
coverage = "==4.0.3"
docopt = "==0.4.0"
eventlet = "==0.19.0"
flake8 = "==3.0.4"
Flask-Cors = "==2.1.2"
Flask-Login = "==0.3.2"
Flask = "==0.12.1"
funcsigs = "==0.4"
fuzzywuzzy = "==0.12.0"
gcloud = "==0.14.0"
html2text = "==2016.9.19"
itsdangerous = "==0.24"
Jinja2 = "==2.8"
jsonpatch = "==1.15"
jsonschema = "==2.5.1"
PyJWT = "==1.4.2"
kombu = "==3.0.30"
LayerClient = "==0.1.9"
MarkupSafe = "==0.23"
mixpanel = "==4.3.0"
mock = "==1.3.0"
nose-exclude = "==0.4.1"
nose = "==1.3.7"
numpy = "==1.12.1"
pdfrw = "==0.3"
Pillow = "==4.1.0"
pusher = "==1.6"
pycountry = "==1.20"
pycryptodome = "==3.4.5"
pymongo = "==3.2"
PyMySQL = "==0.7.4"
python-dateutil = "<=2.5.1"
python-Levenshtein = "==0.12.0"
python-magic = "==0.4.6"
python-coveralls = "==2.9.0"
pytz = "==2015.6"
raygun4py = "==3.1.2"
"repoze.retry" = "==1.3"
requests = "==2.8.1"
sendgrid = "==2.2.1"
slacker = "==0.7.3"
SQLAlchemy-Enum34 = "==1.0.1"
SQLAlchemy-Utils = "==0.31.6"
SQLAlchemy = "==1.1.9"
typing = "==3.5.2.2"
twilio = "==5.6.0"
Unidecode = "==0.4.19"
voluptuous = "==0.8.11"
Wand = "==0.4.4"
watchdog = "==0.8.3"
Werkzeug = "==0.12.1"
wheel = "==0.24.0"
WTForms = "==2.0.2"
xmltodict = "==0.9.2"
zeep = "==0.24.0"

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

์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ž ๊ธˆ ๋‹จ๊ณ„ ์ค‘๋‹จ์œผ๋กœ ์ธํ•ด pipenv๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

๋‹ค์‹œ @Diggsey , ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์ง€๋งŒ projects.py API์— ๋Œ€ํ•ด ์ค‘๋‹จ๋˜๋ฏ€๋กœ ๋‹ค์Œ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค๊นŒ์ง€ ๋ณด๋ฅ˜ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๋‹ค์Œ ๋ช‡ ์ฃผ ์•ˆ์— ์ค€๋น„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์—ด์–ด ๋‘ก๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” PyCon์—์„œ ํ•จ๊ป˜ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์งˆ์ฃผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณง ๋” ๋นจ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ๋Š๋ฆฐ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์–ผ์–ด ๋ถ™์Šต๋‹ˆ๋‹ค ...

pipenv install my_package ๋˜๋Š” ๊ฐ„๋‹จํ•œ pipenv install ๋Š” 20๋ถ„ ํ›„์— ์•„๋ฌด ์ถœ๋ ฅ๋„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ํ™•์ธ, ๋ช‡ ์‹œ๊ฐ„ ํ›„์—๋„ ์—ฌ์ „ํžˆ ์•„๋ฌด ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฌธ์ œ์ธ๊ฐ€์š”? ํ‰์†Œ์—๋Š” ๋Š๋ฆฌ์ง€๋งŒ 5~10๋ถ„ ๋งŒ์— ๋์ด ๋‚ฌ๋‹ค.

@NicolasWebDev ๋‹˜ , ์–ด๋–ค ๋ฒ„์ „์˜ pipenv๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ๋˜ํ•œ ์‹œ์Šคํ…œ์— ๋ณ„๋„๋กœ delegator.py ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ๋ฒ„์ „์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ v3.6.0์—์„œ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋ชจ๋“  ๊ฒƒ์ด ์ตœ์‹  ์ƒํƒœ๋ผ๋ฉด Pipfile์˜ ๋‚ด์šฉ์„ ์ œ๊ณตํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”!

์•ˆ๋…•ํ•˜์„ธ์š” @nateprewitt , ๋‹น์‹ ์ด ๋งž์•˜์Šต๋‹ˆ๋‹ค. ์ €๋Š” v3.5.x์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 4.1.1๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ •์ง€ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์•„์ง 5๋ถ„์ด ๊ฑธ๋ฆฌ์ง€๋งŒ ์ตœ์†Œํ•œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์†Œ์Œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. pip๋ฅผ ํ†ตํ•ด ์„ค์น˜๋œ ํŒจํ‚ค์ง€๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ•ญ์ƒ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌ ํ•ด์š”!

@NicolasWebDev์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค! ์šฐ๋ฆฌ๋Š” ์ด ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ #373์ด ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ํ•œ ๊ฑธ์Œ ๋” ๊ฐ€๊นŒ์›Œ์ง€๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@Diggsey @NicolasWebDev , ์ €๋Š” ์ด๋Ÿฌํ•œ ์†๋„ ํ–ฅ์ƒ์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•˜๋Š” 4.1.2๋ฅผ ๋ฐฉ๊ธˆ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ•ด์•ผ ํ•  ์ผ์ด ์•„์ง ๋‚จ์•„ ์žˆ์ง€๋งŒ, ์ด๊ฒƒ์€ ์ ์–ด๋„ pipenv์˜ ์ดˆ๊ธฐ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@nateprewitt ์—…๋ฐ์ดํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ pipenv๊ฐ€ ๋” ๋นจ๋ผ ๋ณด์ด์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ pipenv lock ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ Locking [packages] dependencies... ๊ทธ ์‹œ๊ฐ„์˜ ๋Œ€๋ถ€๋ถ„.

@Diggsey , ๊ทธ ๋งŽ์€ ์‹œ๊ฐ„์€ ํ•ด๋‹น Pipfile์—์„œ ์—„์ฒญ๋‚œ ์ˆ˜์˜ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…์†์„ฑ์„ ๊ณ ์ •ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์„ ํ”„๋กœ์ ํŠธ๋กœ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๊ฒƒ๋“ค์˜ ์ผ๋ถ€ ์ข…์†์„ฑ ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๊นŒ?

@nateprewitt ์šฐ๋ฆฌ๋Š” ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ ์ง์ ‘์ ์ธ ์ข…์†์„ฑ์ž…๋‹ˆ๋‹ค. ์ž ๊ธˆ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์˜์กด์„ฑ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๊ฐ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ž ๊ธˆ ์‹œ๊ฐ„์— ์„ค์น˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Pipfile.lock์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ ์ ˆํ•˜๊ฒŒ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œ ์—†์ด๋Š” ํ•˜์œ„ ์ข…์†์„ฑ์„ ํ™•์ธํ•˜๊ณ  ๋ฒ”์œ„ ์ข…์†์„ฑ ์„ ์–ธ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ํŒจํ‚ค์ง€๊ฐ€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‹ค์šด๋กœ๋“œํ•œ ํŒจํ‚ค์ง€๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Diggsey ๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ์งˆ๋ฌธ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ Pip์€ ์ด๋ฏธ ํŒจํ‚ค์ง€ ์บ์‹ฑ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

pipenv๋Š” pip ์บ์‹œ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

Pipenv๋Š” pip๋งŒ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ์บ์‹œ๊ฐ€ ์ž๋™์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ์ •๋œ! ์ž๋ฌผ์‡ ๋Š” ์ง€๊ธˆ ์‚ฌ์•…ํ•ฉ๋‹ˆ๋‹ค.

์˜ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ง์žฅ์—์„œ ๋ชจ๋“  ์‚ฌ๋žŒ์„ pipenv๋กœ ๋ฐ€์–ด๋ถ™์ด๋Š” ๊ฒƒ์ด ๋‚ด ๋“ฑ์„ ์ง€ํƒฑํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์™€์šฐ, ์ข‹์Šต๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ 100๋ฐฐ ์ด์ƒ์˜ ์†๋„ ํ–ฅ์ƒ์ด์—ˆ๊ณ  ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•œ ์ข…์†์„ฑ ์ถฉ๋Œ๋„ ํฌ์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค!

๋ฌด์—‡ ์œ ์šฉ ํ•  ๊ฒƒ์€์ž…๋‹ˆ๋‹ค verbose ๋Œ€ํ•œ ํ”Œ๋ž˜๊ทธ pipenv lock - ๋‚˜๋Š” ๋‹จ์ง€ ํŽธ์ง‘ํ•˜์—ฌ ์ข…์†์„ฑ ์ถฉ๋Œ์„ ์ง„๋‹จ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค piptools/logging.py ๊ธฐ๋ก ์ž์„ธํ•œ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜์ง€๋งŒ, ๋‚ด๊ฐ€ ํ•œ ๋ฒˆ ๊ทธ๊ฒƒ์„ ์ค€ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋งค์šฐ ๋ช…ํ™•ํ•œ ํ‘œ์‹œ.

๋‚˜๋Š” ์•„๋งˆ๋„ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค :) ๊ทธ๊ฒƒ์€ ์–ด๋””์—์„œ ์ˆ˜์ • ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์ตœ์‹  ๋ฆด๋ฆฌ์Šค๊ฐ€ 4์ผ ์ „์ด๋ฏ€๋กœ master ์—์„œ ์ตœ์‹  ๋ฒ„์ „์„ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ pipenv install ๋Š” ์—ฌ์ „ํžˆ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹œ๋„ํ–ˆ๋‹ค:

  • ๋ฉ‹์ง„ ๋ฐฉ๋ฒ•์œผ๋กœ pipenv ์„ค์น˜ โšก๏ธ ๐Ÿฐ โšก๏ธ
  • ๋ชจ๋‘์˜ ์ตœ์‹  ๋ฐœํ–‰ ๋ณธ ์‚ฌ์šฉ pipenv ์—์„œ ์ตœ์‹  ๋ฒ„์ „ master
  • ๋‹จ์ผ ํŒจํ‚ค์ง€ ์„ค์น˜

์ตœ์‹  ์•ˆ์ • ๋ฒ„์ „(5.3.5.)์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐ 3:40์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

โˆ™ time pipenv install --dev raven
Installing raven...
Collecting raven
  Using cached raven-6.1.0-py2.py3-none-any.whl
Collecting contextlib2 (from raven)
  Using cached contextlib2-0.5.5-py2.py3-none-any.whl
Installing collected packages: contextlib2, raven
Successfully installed contextlib2-0.5.5 raven-6.1.0

Adding raven to Pipfile's [dev-packages]...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Updated Pipfile.lock!
pipenv install --dev raven  10,11s user 2,77s system 5% cpu 3:40,04 total

master ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ์ „ํžˆ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค(ํŒจํ‚ค์ง€ 1๊ฐœ, +10๋ถ„)

ํŽธ์ง‘: ๋ฐฉ๊ธˆ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

pipenv install graphene_django  8,03s user 1,28s system 1% cpu 11:23,11 total

์–ด๋–ค ์•„์ด๋””์–ด? ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

ํŠนํžˆ c ์ปดํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Pipfile ๋ฅผ ๊ณต์œ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋•Œ๋•Œ๋กœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์€ ์ดํ•ดํ•˜์ง€๋งŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋Š๋ ธ์Šต๋‹ˆ๋‹ค. ์ œ ๋ฌธ์ œ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด Pipfile์ด ์žˆ์Šต๋‹ˆ๋‹ค:

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[dev-packages]
pytest = "*"
pytest-django = "*"
pytest-testmon = "*"
pytest-watch = "*"
django-debug-toolbar = "*"
raven = "*"

[packages]
dj-database-url = "*"
Django = "*"
djangorestframework = "*"
gunicorn = "*"
newrelic = "*"
psycopg2 = "*"
requests = "*"
whitenoise = "*"
graphene-django = "*"

psycopg2๋Š” ์†Œ์Šค์—์„œ ์ปดํŒŒ์ผ ์ค‘์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ํ›Œ๋ฅญํ•˜๊ณ  ๋นจ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๊ณ  ์†๋„๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ฆ๊ฐ€ํ•˜๋Š”์ง€๋ณด์‹ญ์‹œ์˜ค.

$ pipenv install raven ๋Š” 1์ดˆ ์ •๋„ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

$ pipenv install raven์€ ์ €์—๊ฒŒ 1์ดˆ์ฒ˜๋Ÿผ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์–ด๋–ป๊ฒŒ ๋“  ์ž์„ธํ•œ ์ถœ๋ ฅ์„ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

psycopg2 ์ œ๊ฑฐ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ๋ณ„๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. pipenv install raven ์‹คํ–‰์ด ์ž ์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ€์ง€๊ณ ์žˆ๋‹ค:

  • ํŒŒ์ด์ฌ 3.6.2
  • ๋งฅOS 10.12.6

๊นŒ๋งˆ๊ท€๊ฐ€ ์ˆœ๊ฐ„์ ์ด์ง€ ์•Š์•„์•ผ ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

$ pip install raven ์•ˆ์—์„œ $ pipenv shell ํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ๋„ ๋Š๋ฆฐ์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

pipenv๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์€ pip๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์‚ฌ์‹ค์ƒ "์ƒ์„ธ ๋ชจ๋“œ"์ž…๋‹ˆ๋‹ค.

์ฆ‰์„์ž…๋‹ˆ๋‹ค.

โˆ™ time pip install raven                                                                                                                                 19:38  tricoder<strong i="6">@issac</strong>
Requirement already satisfied: raven in /Users/tricoder/.envs/lingui-api-VE1OToiy/lib/python3.6/site-packages
Requirement already satisfied: contextlib2 in /Users/tricoder/.envs/lingui-api-VE1OToiy/lib/python3.6/site-packages (from raven)
noglob pip install raven  0,54s user 0,15s system 76% cpu 0,900 total

pipenv ์‹คํ–‰ pipenv shell ๋‚ด๋ถ€/์™ธ๋ถ€).

โˆ™ time pipenv install raven                                                                                                                              19:39  tricoder<strong i="12">@issac</strong>
Installing raven...
Requirement already satisfied: raven in /Users/tricoder/.envs/lingui-api-VE1OToiy/lib/python3.6/site-packages
Requirement already satisfied: contextlib2 in /Users/tricoder/.envs/lingui-api-VE1OToiy/lib/python3.6/site-packages (from raven)

Adding raven to Pipfile's [packages]...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Updated Pipfile.lock!
pipenv install raven  4,49s user 0,46s system 2% cpu 3:21,17 total

@Diggsey --verbose ์— ๋Œ€ํ•œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ์›ํ•˜๋Š” ๋ชจ์–‘์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@tricoder42 ๋Š” ๋Š๋ฆฐ ๋ถ€๋ถ„์ด ์ž ๊ธˆ ๋‹จ๊ณ„์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์„ค์น˜ ๋‹จ๊ณ„์ž…๋‹ˆ๊นŒ? ์ž ๊ธˆ์€ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค์—์„œ ํฌ๊ฒŒ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

```์‰˜
$ time pipenv ์„ค์น˜ ๊นŒ๋งˆ๊ท€
๊นŒ๋งˆ๊ท€ ์„ค์น˜ ์ค‘...
๊นŒ๋งˆ๊ท€ ์ˆ˜์ง‘
์บ์‹œ๋œ raven-6.1.0-py2.py3-none-any.whl ์‚ฌ์šฉ
์š”๊ตฌ ์‚ฌํ•ญ์ด ์ด๋ฏธ ์ถฉ์กฑ๋จ: /Users/kennethreitz/.local/share/virtualenvs/pipenv-u9yqWeFK/lib/python3.6/site-packages์˜ contextlib2(raven์—์„œ)
์ˆ˜์ง‘๋œ ํŒจํ‚ค์ง€ ์„ค์น˜: raven
raven-6.1.0์„ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

Pipfile์˜ [ํŒจํ‚ค์ง€]์— ๊นŒ๋งˆ๊ท€ ์ถ”๊ฐ€ ์ค‘...
[dev-packages] ์ข…์†์„ฑ์„ ์ž ๊ทธ๋Š” ์ค‘...
[ํŒจํ‚ค์ง€] ์ข…์†์„ฑ์„ ์ž ๊ทธ๋Š” ์ค‘...
์—…๋ฐ์ดํŠธ๋œ Pipfile.lock!
9.30 ์‹ค์ œ 5.49 ์‚ฌ์šฉ์ž 0.42 ์‹œ์Šคํ…œ

50์‹œ 50๋ถ„์— ์„ค์น˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:์ž ๊ธˆ

@ tricoder42 ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ์ตœ์‹ ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ •ํ™•ํ•œ pipfile๋กœ ๋ณต์ œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค:

โˆ™ pipenv --version                                                                                                                                       19:42  tricoder<strong i="6">@issac</strong>
pipenv, version 5.3.5
โˆ™ pipsi upgrade git+https://github.com/kennethreitz/pipenv.git#egg=pipenv                                                                                19:45  tricoder<strong i="9">@issac</strong>
Collecting pipenv from git+https://github.com/kennethreitz/pipenv.git#egg=pipenv
  Cloning https://github.com/kennethreitz/pipenv.git to /private/var/folders/g9/1wbckv154mbby3tm411z_m340000gn/T/pip-build-se4ao5/pipenv
...
Installing collected packages: pipenv
  Found existing installation: pipenv 5.3.5
    Uninstalling pipenv-5.3.5:
      Successfully uninstalled pipenv-5.3.5
  Running setup.py install for pipenv ... done
Successfully installed pipenv-5.3.5

```์‰˜
$ ์‹œ๊ฐ„ pipenv ์„ค์น˜
์ œ๊ณต๋œ ํŒจํ‚ค์ง€๊ฐ€ ์—†์œผ๋ฉฐ ๋ชจ๋“  ์ข…์†์„ฑ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
Pipfile์€ /Users/kennethreitz/pipenv/testapp/Pipfile์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํ”„๋กœ์ ํŠธ ํ™ˆ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.
Pipfile.lock์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ ์ค‘...
[dev-packages] ์ข…์†์„ฑ์„ ์ž ๊ทธ๋Š” ์ค‘...
[ํŒจํ‚ค์ง€] ์ข…์†์„ฑ์„ ์ž ๊ทธ๋Š” ์ค‘...
์—…๋ฐ์ดํŠธ๋œ Pipfile.lock!
Pipfile.lock์—์„œ ์ข…์†์„ฑ ์„ค์น˜ ์ค‘...
[==================================] 22/22 - 00:00:37
58.94 ์‹ค์ œ 40.51 ์‚ฌ์šฉ์ž 8.62 ์‹œ์Šคํ…œ

์ƒˆ pipenv์— ์ฒซ ๋ฒˆ์งธ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๊ฒƒ์ด๋‹ค pipenv --three ๋Œ€์‹  pipenv --python python3.6

@triccoder42 1์‹œ๊ฐ„ ๋งŒ์— ๊ตฌ๊ธ€ ํ–‰์•„์›ƒ์—

๋˜๋Š” Messages.app์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Apple ํ™”๋ฉด ๊ณต์œ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•ด! ์ €๋Š” [email protected]์ž…๋‹ˆ๋‹ค.

ํšŒ์˜์— ์ฐธ์—ฌํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ๊ทธ ์ดํ›„์— ์ฐธ์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์›ํ•œ! ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ฒƒ์„ ์ฒญ์†Œํ•˜๊ณ  ๋‹ค์‹œ ์„ค์น˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 1์‹œ๊ฐ„ ์•ˆ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์•Œ์•„๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. message.app์— ์ €๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š” :)

๋ˆ„๊ตฐ๊ฐ€ v11.9.0 ๋งค์šฐ ๋Š๋ฆฐ Locking ๋™์ž‘์„ ๊ฒฝํ—˜ํ•˜๋Š” ๊ฒฝ์šฐ v9.0.0 ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐ 5๋ถ„ 30์ดˆ๊ฐ€ ์†Œ์š”๋˜๋Š” 1๋ถ„ 36์ดˆ๊ฐ€ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

@ryantuck 9.0.3 ๋ฅผ ๊ณ ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „ ๋ฒ„์ „์„ ๊ณ ์ •ํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ์†๋„์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ณด์•ˆ์„ ์ƒ๋‹นํžˆ ์žƒ๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ --skip-lock ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ ์ 

--skip-lock ํ™•์‹คํžˆ ์†๋„๋ฅผ ๋†’์˜€์Šต๋‹ˆ๋‹ค. pipenv install --system --python=3.6 ๊ฐ€ ์‹ค์ œ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์‹œ์Šคํ…œ ํŒŒ์ด์ฌ์— ์„ค์น˜๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐ”์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ ์„ค์น˜๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์ „์— Pipfile.lock ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ผ๋ฐ˜ ์ด์ „ pip ์‚ฌ์šฉ์œผ๋กœ ๋Œ์•„๊ฐ”์ง€๋งŒ ์ด ๋ผ์ธ์„ ๋”ฐ๋ผ ์ง„์ „์ด ์žˆ๋‹ค๋ฉด ์ด ์Šค๋ ˆ๋“œ์— ๋‹ค์‹œ ๋Œ“๊ธ€์„ ๋‹ฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

โ€”system ๋ฐ โ€”python ๋Š” ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค. ํ›„์ž์˜ ์˜ต์…˜์—๋Š” ํ•ญ์ƒ virtualenv๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ž ๊ธˆ๋„ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. v11.10.0. WSL์˜ ์šฐ๋ถ„ํˆฌ.

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages]
babel = "==2.5.3"
"boto3" = "==1.7.3"
colorama = "==0.3.9"
coreapi = "==2.3.3"
dj-database-url = "==0.5.0"
djangorestframework = "==3.7.7"
django-axes = "==4.0.2"
django-clever-selects = "==0.8.2"
django-crispy-forms = "==1.7.2"
django-choices = "==1.6.0"
django-extra-views = "==0.10.0"
django-filter = "==1.1.0"
django-hijack = "==2.1.7"
django-hijack-admin = "==2.1.7"
django-js-reverse = "==0.8.1"
django-model-utils = "==3.1.1"
django-phonenumber-field = "==2.0.0"
django-polymorphic = "==2.0.2"
django-redis-cache = "==1.7.1"
django-role-permissions = "==2.2.0"
"django-s3direct" = "==1.0.4"
django-static-precompiler = {extras = ["libsass"], version = "==1.8.2"}
django-storages = "==1.6.6"
"django-tables2" = "==1.21.2"
django-webpack-loader = "==0.6.0"
django-widget-tweaks = "==1.4.2"
facebookads = "==2.11.4"
googleads = "==11.0.1"
markdown = "==2.6.11"
phonenumbers = "==8.9.3"
pillow = "==5.1.0"
"psycopg2-binary" = "==2.7.4"
pygments = "==2.2.0"
pyssim = "==0.4"
python-dotenv = "==0.8.2"
pytz = "==2018.4"
raven = "==6.6.0"
sendgrid-django = "==4.2.0"
slacker = "==0.9.65"
termcolor = "==1.1.0"
tqdm = "==4.21.0"
twitter-ads = "==3.0.0"
brotlipy = "==0.7.0"
waitress = "==1.1.0"
whitenoise = "==3.3.1"
Django = "==2.0.4"

[dev-packages]
coverage = "==4.5.1"
selenium = "==3.11.0"
tblib = "==1.3.2"
"flake8" = "==3.5.0"
django-debug-toolbar = "==1.9.1"
django-extensions = "==2.0.6"

[requires]
python_version = "3.6"
Pipfile.lock not found, creatingโ€ฆ
Locking [dev-packages] dependenciesโ€ฆ
Locking [packages] dependenciesโ€ฆ
Updated Pipfile.lock (7a535c)!
Installing dependencies from Pipfile.lock (7a535c)โ€ฆ
  ๐Ÿ   โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰ 92/92 โ€” 00:01:01

real    8m1.993s
user    5m32.406s
sys     7m15.203s

๋‘ ๋ฒˆ์งธ๋‚˜ ์„ธ ๋ฒˆ์งธ๋Š” ์กฐ๊ธˆ ๋” ๋นจ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์บ์‹ฑ. ๊ฐœ์„ ์ด ๋ณด์ด์‹œ๋‚˜์š”?
2018๋…„ 4์›” 12์ผ ๋ชฉ์š”์ผ ์˜ค์ „ 10:23 Alexander Kavanaugh <
[email protected]>์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ž ๊ธˆ๋„ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. v11.10.0. WSL์˜ ์šฐ๋ถ„ํˆฌ.

[[์†Œ์Šค]]url = " https://pypi.python.org/simple "verify_ssl = truename = "pypi"
[ํŒจํ‚ค์ง€]babel = "==2.5.3""boto3" = "==1.7.3"colorama = "==0.3.9"coreapi = "==2.3.3"dj-database-url = "== 0.5.0"djangorestframework = "==3.7.7"django-axes = "==4.0.2"django-clever-selects = "==0.8.2"django-crispy-forms = "==1.7.2" django-choices = "==1.6.0"django-extra-views = "==0.10.0"django-filter = "==1.1.0"django-hijack = "==2.1.7"django-hijack- ๊ด€๋ฆฌ์ž = "==2.1.7"django-js-reverse = "==0.8.1"django-model-utils = "==3.1.1"django-phonenumber-field = "==2.0.0"django- ๋‹คํ˜•์„ฑ = "==2.0.2"django-redis-cache = "==1.7.1"django-role-permissions = "==2.2.0""django-s3direct" = "==1.0.4"django- ์ •์  ์‚ฌ์ „ ์ปดํŒŒ์ผ๋Ÿฌ = {extras = ["libsass"], ๋ฒ„์ „ = "==1.8.2"}django-storages = "==1.6.6""django-tables2" = "==1.21.2"django-webpack -loader = "==0.6.0"django-widget-tweaks = "==1.4.2"facebookads = "==2.11.4"googleads = "==11.0.1"markdown = "==2.6.11" ์ „ํ™” ๋ฒˆํ˜ธ = "==8.9.3"๋ฒ ๊ฐœ = "==5.1.0""psycopg2-binary" = "==2.7.4"pygments = "==2.2.0"pyssim = "==0.4"python-dotenv = "==0.8.2"ํŒŒ์ด์ธ  = "==2018.4" ๊นŒ๋งˆ๊ท€ = "==6.6.0"sendgrid-django = "==4.2.0"slacker = "==0.9.65"termcolor = "==1.1.0"tqdm = "==4.21.0"twitter-ads = "==3.0.0" ๋ธŒ๋กœํ‹€๋ฆฌํ”ผ = "==0.7.0" ์›จ์ดํŠธ๋ฆฌ์Šค = "==1.1.0" ํ™”์ดํŠธ๋…ธ์ด์ฆˆ = "==3.3.1" ์žฅ๊ณ  = "==2.0.4"
[๊ฐœ๋ฐœ ํŒจํ‚ค์ง€] ์ ์šฉ ๋ฒ”์œ„ = "==4.5.1"์…€๋ ˆ๋Š„ = "==3.11.0"tblib = "==1.3.2""flake8" = "==3.5.0"django-debug-toolbar = " ==1.9.1"django ํ™•์žฅ์ž = "==2.0.6"
[ํ•„์ˆ˜]python_version = "3.6"

Pipfile.lock์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ ์ค‘โ€ฆ
[dev-packages] ์ข…์†์„ฑ ์ž ๊ธˆ ์ค‘โ€ฆ
[ํŒจํ‚ค์ง€] ์ข…์†์„ฑ ์ž ๊ธˆ ์ค‘โ€ฆ
์—…๋ฐ์ดํŠธ๋œ Pipfile.lock(7a535c)!
Pipfile.lock(7a535c)์—์„œ ์ข…์†์„ฑ ์„ค์น˜ ์ค‘โ€ฆ
๐Ÿ โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰

์‹ค์ œ 8m1.993์ดˆ
์‚ฌ์šฉ์ž 5m32.406s
์‹œ์Šคํ…œ 7m15.203s

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/pypa/pipenv/issues/356#issuecomment-380882203 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/ABhjqwIPyHtX0NTVoV1UPYR7HcwYm-2kks5tn42SgaJpZM4NbeoN
.

๊ทธ ์ „์— ์ด๋ฏธ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์ž ๊ธˆ ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๊ณ  ์„ค์น˜๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jtratner ์™€์šฐ. ๋งค์šฐ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค... ์„ธ ๋ฒˆ์งธ ์ด์ƒ ํ›„์—๋งŒ ์บ์‹ฑ์ด ์‹œ์ž‘๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Pipfile.lock not found, creatingโ€ฆ
Locking [dev-packages] dependenciesโ€ฆ
Locking [packages] dependenciesโ€ฆ
Updated Pipfile.lock (7a535c)!
Installing dependencies from Pipfile.lock (7a535c)โ€ฆ
An error occurred while installing coreapi==2.3.3! Will try again.
  ๐Ÿ   โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰ 92/92 โ€” 00:00:58
Installing initiallyโ€“failed dependenciesโ€ฆ
Success installing coreapi==2.3.3!โ–‰โ–‰โ–‰ 0/1 โ€” 00:00:00
  โ˜ค  โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰ 1/1 โ€” 00:00:01

real    2m50.218s
user    2m19.438s
sys     5m44.797s
Pipfile.lock not found, creatingโ€ฆ
Locking [dev-packages] dependenciesโ€ฆ
Locking [packages] dependenciesโ€ฆ
Updated Pipfile.lock (7a535c)!
Installing dependencies from Pipfile.lock (7a535c)โ€ฆ
  ๐Ÿ   โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰ 92/92 โ€” 00:00:55

real    2m32.042s
user    2m6.516s
sys     5m10.219s

@kavdev @jtratner ๋Š” ํ•ด์‹œ๋ฅผ ์บ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ๋„์ž…ํ•˜์—ฌ ์ƒ๋‹นํ•œ ๊ฐœ์„ ์„ ์ด๋ฃจ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์žˆ์–ด์š”... 15๋ถ„ ํ›„

@giantas ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. pip ์„ค์น˜ ์‹œ pipfile, ์ถœ๋ ฅ ๋ฐ ๊ธฐ๊ฐ„์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ๊ฐœ๋ณ„ ํŒจํ‚ค์ง€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€.

๋‚ด ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๊ฝค ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. macOS 10.13.4, pipenv, ๋ฒ„์ „ 11.10.0

๋‹ค์šด๋กœ๋“œ๋Š” ๊ฑฐ์˜ ์ฆ‰์‹œ ์‹คํ–‰๋˜์ง€๋งŒ Locking [packages] dependenciesโ€ฆ ์—์„œ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— 2๊ฐœ์˜ ์ข…์†์„ฑ์— ๋Œ€ํ•ด 30๋ถ„์ด ์†Œ์š”๋˜๊ณ  ๋‹ค๋ฅธ 3๊ฐœ์˜ ์ข…์†์„ฑ์— ๋Œ€ํ•ด 6๋ถ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์ข…์†์„ฑ์„ ์—ฌ๊ธฐ์— ๋˜์ง€๋ฉด ์ž ๊ธˆ ๋‹จ๊ณ„์—์„œ ๋ฌด๊ธฐํ•œ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

pablo<strong i="8">@batman</strong> scanr (develop) $ time pipenv install flask flask_pymongo
Installing flaskโ€ฆ
Looking in indexes: https://pypi.python.org/simple
Collecting flask
  Using cached https://files.pythonhosted.org/packages/77/32/e3597cb19ffffe724ad4bf0beca4153419918e7fa4ba6a34b04ee4da3371/Flask-0.12.2-py2.py3-none-any.whl
Collecting Werkzeug>=0.7 (from flask)
  Using cached https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl
Collecting itsdangerous>=0.21 (from flask)
Collecting Jinja2>=2.4 (from flask)
  Using cached https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl
Collecting click>=2.0 (from flask)
  Using cached https://files.pythonhosted.org/packages/34/c1/8806f99713ddb993c5366c362b2f908f18269f8d792aff1abfd700775a77/click-6.7-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.4->flask)
Installing collected packages: Werkzeug, itsdangerous, MarkupSafe, Jinja2, click, flask
Successfully installed Jinja2-2.10 MarkupSafe-1.0 Werkzeug-0.14.1 click-6.7 flask-0.12.2 itsdangerous-0.24

Adding flask to Pipfile's [packages]โ€ฆ
Installing flask_pymongoโ€ฆ
Looking in indexes: https://pypi.python.org/simple
Collecting flask_pymongo
  Using cached https://files.pythonhosted.org/packages/fa/71/ab920741dedd605ef4adbd57d0c7d9f43a6b6fe4068604fffbc6f64b2c9c/Flask_PyMongo-0.5.1-py3-none-any.whl
Requirement already satisfied: Flask>=0.8 in /Users/pablo/.local/share/virtualenvs/scanr-2m6AW0PB/lib/python3.6/site-packages (from flask_pymongo) (0.12.2)
Collecting PyMongo>=2.5 (from flask_pymongo)
  Using cached https://files.pythonhosted.org/packages/5c/7f/1f7240883ec3fa768d7e066c9cbd42ceb42d699ba1a0fb9d231c098a542d/pymongo-3.6.1-cp36-cp36m-macosx_10_6_intel.whl
Requirement already satisfied: click>=2.0 in /Users/pablo/.local/share/virtualenvs/scanr-2m6AW0PB/lib/python3.6/site-packages (from Flask>=0.8->flask_pymongo) (6.7)
Requirement already satisfied: itsdangerous>=0.21 in /Users/pablo/.local/share/virtualenvs/scanr-2m6AW0PB/lib/python3.6/site-packages (from Flask>=0.8->flask_pymongo) (0.24)
Requirement already satisfied: Werkzeug>=0.7 in /Users/pablo/.local/share/virtualenvs/scanr-2m6AW0PB/lib/python3.6/site-packages (from Flask>=0.8->flask_pymongo) (0.14.1)
Requirement already satisfied: Jinja2>=2.4 in /Users/pablo/.local/share/virtualenvs/scanr-2m6AW0PB/lib/python3.6/site-packages (from Flask>=0.8->flask_pymongo) (2.10)
Requirement already satisfied: MarkupSafe>=0.23 in /Users/pablo/.local/share/virtualenvs/scanr-2m6AW0PB/lib/python3.6/site-packages (from Jinja2>=2.4->Flask>=0.8->flask_pymongo) (1.0)
Installing collected packages: PyMongo, flask-pymongo
Successfully installed PyMongo-3.6.1 flask-pymongo-0.5.1

Adding flask_pymongo to Pipfile's [packages]โ€ฆ
Pipfile.lock (c202d3) out of date, updating to (3068be)โ€ฆ
Locking [dev-packages] dependenciesโ€ฆ
Locking [packages] dependenciesโ€ฆ
Updated Pipfile.lock (3068be)!
Installing dependencies from Pipfile.lock (3068be)โ€ฆ
  ๐Ÿ   โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰ 32/32 โ€” 00:00:03
To activate this project's virtualenv, run the following:
 $ pipenv shell

real    0m37.816s
user    0m34.556s
sys 0m4.517s
pablo<strong i="5">@batman</strong> scanr (develop) $ time pipenv install gunicorn h5py joblib
Installing gunicornโ€ฆ
Looking in indexes: https://pypi.python.org/simple
Collecting gunicorn
  Using cached https://files.pythonhosted.org/packages/64/32/becbd4089a4c06f0f9f538a76e9fe0b19a08f010bcb47dcdbfbc640cdf7d/gunicorn-19.7.1-py2.py3-none-any.whl
Installing collected packages: gunicorn
Successfully installed gunicorn-19.7.1

Adding gunicorn to Pipfile's [packages]โ€ฆ
Installing h5pyโ€ฆ
Looking in indexes: https://pypi.python.org/simple
Collecting h5py
  Using cached https://files.pythonhosted.org/packages/69/d5/dff2a8f7658fd87ab3330a0ab47e4363681d8bdf734a495add65a347f5e3/h5py-2.7.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
Requirement already satisfied: six in /Users/pablo/.local/share/virtualenvs/scanr-2m6AW0PB/lib/python3.6/site-packages (from h5py) (1.11.0)
Collecting numpy>=1.7 (from h5py)
  Using cached https://files.pythonhosted.org/packages/a0/df/fa637677800e6702a57ef09e1d62e42aec3f598fb235f897155d146f2f59/numpy-1.14.2-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
Installing collected packages: numpy, h5py
Successfully installed h5py-2.7.1 numpy-1.14.2

Adding h5py to Pipfile's [packages]โ€ฆ
Installing joblibโ€ฆ
Looking in indexes: https://pypi.python.org/simple
Collecting joblib
  Using cached https://files.pythonhosted.org/packages/4f/51/870b2ec270fc29c5d89f85353da420606a9cb39fba4747127e7c7d7eb25d/joblib-0.11-py2.py3-none-any.whl
Installing collected packages: joblib
Successfully installed joblib-0.11

Adding joblib to Pipfile's [packages]โ€ฆ
Pipfile.lock (0d514f) out of date, updating to (a4d15f)โ€ฆ
Locking [dev-packages] dependenciesโ€ฆ
Locking [packages] dependenciesโ€ฆ
Updated Pipfile.lock (a4d15f)!
Installing dependencies from Pipfile.lock (a4d15f)โ€ฆ
  ๐Ÿ   โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰โ–‰ 36/36 โ€” 00:00:03
To activate this project's virtualenv, run the following:
 $ pipenv shell

real    6m31.572s
user    1m1.986s
sys 0m11.047s

@pablote ๋Š๋ฆฐ ์  ์žฅ! ์ด๊ฒƒ์€ ๋ถ€๋ถ„์ ์œผ๋กœ numpy ์„ค์น˜๋กœ ์ธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†Œ์Šค์—์„œ ์ž ๊ธˆ ๋˜๋Š” ์–ด๋ฆฌ์„์€ ๊ฒƒ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์œ ์šฉํ•œ ์ถœ๋ ฅ์„ ์ œ๊ณตํ•˜๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ pipenv๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋Š๋ฆฐ ์ž ๊ธˆ ํŒŒ์ผ ์‹œ๊ฐ„์„ ๊ฐ–๋Š” ๋ฐ ์šด์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๊นŒ? --skip-lock์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ ๊ธฐ๋Šฅ์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

@pablote ๋™์ผํ•œ ์ž ๊ธˆ ์ž‘์—…์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ์ „ํžˆ ๋Š๋ฆฐ๊ฐ€์š”?

๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ๊ฑฐ์˜ ์ฆ‰์‹œ ์™„๋ฃŒ๋˜๋ฏ€๋กœ ์ƒˆ๋กœ์šด ์ข…์†์„ฑ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์€ ์ฒ˜์Œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ ๋กœ์ปฌ์—์„œ ํ•ด์‹œ๋ฅผ ์บ์‹ฑํ•˜๋ฏ€๋กœ ์–ด๋–ค ์ด์œ ๋กœ๋“  ์—ฌ๊ธฐ์—์„œ ์—„์ฒญ๋‚˜๊ฒŒ ๋Š๋ฆฐ ํ•ด์‹œ ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค...

์ง„๋‹จ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ์ž ์‹œ ๋™์•ˆ์€ pip + virtualenv + pip-tools๋กœ ๋Œ์•„๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค./

@pablote ํ•ด์‹œ๊ฐ€ ํ•œ ๋ฒˆ ์žˆ์œผ๋ฉด ๋‹ค์‹œ ์ž ๊ทธ๋ฉด ๊ทธ๋ ‡๊ฒŒ ๋Š๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ์ถœ๋ ฅ์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ๋ฐฉ๊ธˆ #1622 ---์— ๋”ฐ๋ผ ํŒจํ‚ค์ง€ ์ž ๊ธˆ ๋‹จ๊ณ„์—์„œ ์ž˜๋ชป๋œ ๋งˆ์ปค ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด pipenv๋ฅผ 9.1.0์—์„œ 11.10.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ipykernel, pandas, jupyter, numpy๊ฐ€ ํฌํ•จ๋œ pipfile์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— matplotlib๊ฐ€ ์žˆ๊ณ  pipenv install ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž ๊ธˆ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ ค๋Š” ์ตœ๊ทผ ์‹œ๋„์™€ ํ•จ๊ป˜ locking [packages] dependenciesโ€ฆ ์— 10๋ถ„ ์ด์ƒ ์•‰์•„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ถœ๋ ฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€(์˜ˆ: ์†Œ์Šค์—์„œ numpy ๋นŒ๋“œ) ๋˜๋Š” ๊ทธ๋ƒฅ ๋งค๋‹ฌ๋ ค ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์€ top ์—์„œ ์•ฝ๊ฐ„ ๊ณ๋ˆˆ์งˆํ•˜๊ณ  ํŒŒ์ด์ฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃผ๋ณ€์— ๋งค๋‹ฌ๋ ค ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ๋„ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค... ๋ญ”๊ฐ€ ๋นจ๋ฆฌ ์›€์ง์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด ์ž‘์—…์— ๊ธฐ์—ฌํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ์ถœ๋ ฅ์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ๋ฐฉ๊ธˆ #1622 ---์— ๋”ฐ๋ผ ํŒจํ‚ค์ง€ ์ž ๊ธˆ ๋‹จ๊ณ„์—์„œ ์ž˜๋ชป๋œ ๋งˆ์ปค ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด pipenv๋ฅผ 9.1.0์—์„œ 11.10.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ipykernel, pandas, jupyter, numpy๊ฐ€ ํฌํ•จ๋œ pipfile์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ์— matplotlib๊ฐ€ ์žˆ๊ณ  ์ตœ๊ทผ์— pipenv install์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž ๊ธˆ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ ค๋Š” ์‹œ๋„์™€ ํ•จ๊ป˜ [ํŒจํ‚ค์ง€] ์ข…์†์„ฑ์„ ์ž ๊ทธ๋Š” ๋ฐ 10๋ถ„ ์ด์ƒ ์•‰์•„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์™„์ „ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถˆ๋งŒ ์‚ฌํ•ญ์ด๋ฉฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ์œ ์šฉํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋ ค๊ณ  ์• ์“ฐ๋ฉฐ ๋งˆ์Œ ์†์œผ๋กœ ์ŠคํŠœ์–ด์˜ค๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค(์™œ๋ƒํ•˜๋ฉด ์ถœ๋ ฅ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). 15๋ถ„๋งŒ์— ํฌ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. @techalchemy๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ์บ์‹œ๊ฐ€ ์กฐ๊ธˆ ๋” ์ฑ„์›Œ์งˆ ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ง€์†์ ์œผ๋กœ ๋นจ๋ผ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ: ๊ณต๊ฐœ PyPI๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@jtratner ์˜ˆ, ๊ณต๊ฐœ PyPi ์‚ฌ์šฉ --- ๊ฒฐ๊ตญ ํฌ๊ธฐํ•˜๊ณ  virtualenv๋ฅผ ํ๊ธฐํ•˜๊ณ  ์ƒˆ ๊ฒƒ์„ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ข…์†์„ฑ์„ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์„ค์น˜ํ•˜์—ฌ ์ž ๊ธˆ ํŒŒ์ผ์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. (ํฅ๋ฏธ๋กญ๊ฒŒ๋„ matplotlib์ด ๊ฐ€์žฅ ๋Š๋ฆฌ๊ณ  numpy๋ณด๋‹ค ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค!)

This may take a long time ์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋Š” ๋” ๋ช…ํ™•ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๊ฒฐ์ •๋  ๋•Œ๊นŒ์ง€ ์‚ฌ๋žŒ๋“ค์„ ์•ˆ์‹ฌ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

15๋ถ„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฏธ์นœ๋“ฏ์ด ๊ธธ๋‹ค. ๋‚˜๋Š” ์•‰์•„์„œ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์„์ง€ ์˜์‹ฌ์Šค๋Ÿฝ๋‹ค. @paultopia ๋” ๋งŽ์€ ์ถœ๋ ฅ์„ ์œ„ํ•ด pipenv lock โ€”verbose ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค๋Š” ๋Š๋‚Œ์ด ์žˆ์ง€๋งŒ ์ œ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ๊ณผ์†Œํ‰๊ฐ€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณด๋ฉด pipenv๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ „์ฒด ์‹œ๊ฐ„์— ํŒŒ์ด์ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ ˆ๋Œ€ ~15%๋ฅผ ๋„˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด์‹ฑ ํŒŒ์ผ๊ณผ ๊ฐ™์ด CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. . ๋˜ํ•œ, ์ €๋Š” yarn๊ณผ ๊ฐ™์ด ์ข…์†์„ฑ์„ ํ•ด์‹œํ•˜๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋Š”๋ฐ ์ƒ๋‹นํžˆ ๋น ๋ฆ…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์„ํ•˜๋Š”์ง€ ์•Œ์•„ ๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค ...

์ž ๊ธˆ์„ ์‚ฌ์šฉํ•  ๋•Œ ์†๋„๊ฐ€ ๋Š๋ ค์ง€๋Š” github ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/AndreasPresthammer/slow-pipenv๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋™์ผํ•œ ๋ฌธ์ œ๋ผ๊ณ  100% ํ™•์‹ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. repo๋ฅผ ์•„๋ž˜๋กœ ๋‚ด๋ฆฌ๊ณ  slow.sh ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹คํ–‰ ์‹œ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๊ด€์ฐฐํ•˜์‹ญ์‹œ์˜ค.

@AndreasPresthammer ๋”ฐ๋ผ์„œ ์Šคํฌ๋ฆฝํŠธ๋Š” ์บ์‹œ๋˜์ง€ ์•Š์€ ์ž ๊ธˆ๊ณผ ์ž ๊ธˆ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ์‹œ๊ฐ„์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ์ž ๊ธˆ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋Š๋ฆฝ๋‹ˆ๋‹ค. numpy์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ์„ ์˜๋ฏธํ–ˆ๋˜ ๊ณผ๊ฑฐ์— ํ•ด๊ฒฐ์„ ์œ„ํ•ด sdists๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ฐ”ํ€ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†๋„๊ฐ€ ๋นจ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ตœ์‹  python3.6, pip ๋ฐ pipenv ๋ฒ„์ „๊ณผ torch ์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜์—์„œ ํ™•์‹คํžˆ ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค(5๋ถ„ ์ด์ƒ). ์ด ๋ฌธ์ œ๊ฐ€ ๋‹ซํžŒ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ข…๋ฃŒ๋˜๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์˜๊ฒฌ์„ ๋งํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์€ pipenv lock --verbose ์ถœ๋ ฅ์„ ์ œ๊ณตํ•˜์„ธ์š”. ์†Œ์Šค์—์„œ ์ปดํŒŒ์ผ๋˜๊ณ  ์ •์ƒ์ ์ธ ์กฐ๊ฑด์—์„œ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ํŒจํ‚ค์ง€์˜ ๊ฒฝ์šฐ ํ•ด์ƒ๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์ƒ๋ณด๋‹ค ๋Š๋ฆฐ ๊ฒฝ์šฐ ์›์ธ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์–ป์œผ๋ ค๋ฉด ๋กœ๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— Docker๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Docker ๋‚ด๋ถ€ ์„ค์น˜๊ฐ€ ํ˜ธ์ŠคํŠธ์— ์„ค์น˜ํ•  ๋•Œ๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋ชจ๋“  ํŒจํ‚ค์ง€์˜ ์กฐํ•ฉ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋‚˜๋ณด๋‹ค ๊ฒฝํ—˜์ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Pipfile ๋ฐ Pipfile.lock ํฌํ•จํ•œ pipenv lock --verbose ์˜ ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

https://gist.github.com/mimischi/6270b7ece566cc571b427baaf1c331d4

@mimischi ํ•ด๊ฒฐ ๊ฒฐ๊ณผ๋Š” ํ˜ธ์ŠคํŠธ์— ์บ์‹œ๋˜์ง€๋งŒ Docker๋Š” ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•ด์ƒ๋„๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Š๋ฆฝ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ์˜ ์บ์‹œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ Docker์— ๋งˆ์šดํŠธํ•˜๋ฉด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์šดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ทธ๊ฒƒ์„ ์ฐพ์„ ์‹œ๊ฐ„์ด ์—†์ง€๋งŒ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ํ•  ๋•Œ ๋ฌธ์„œ์˜ FAQ ํŽ˜์ด์ง€ ์— ๊ทธ๊ฒƒ์„ ์ œ๊ณต

FWIW, ๋‚ด ๊ฐœ๋ฐœ ์ƒ์ž๋ฅผ ์ž ๊ทธ๋Š” ๋ฐ ์ด์ œ 30์ดˆ ๋ฏธ๋งŒ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ด์ „๋ณด๋‹ค ํ›จ์”ฌ ์ข‹์•„์กŒ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ๊ฐ€ ์žฅํ™ฉํ•˜๋‹ค

pipenv lock --verbose
Locking [dev-packages] dependenciesโ€ฆ
Using pip: -i https://pypi.python.org/simple

                          ROUND 1                           
Current constraints:
  pylint

Finding the best candidates:
  found candidate pylint==1.9.1 (constraint was <any>)

Finding secondary dependencies:
  pylint==1.9.1             requires astroid<2.0,>=1.6, isort>=4.2.5, mccabe, six

New dependencies found in this round:
  adding ['astroid', '<2.0,>=1.6', '[]']
  adding ['isort', '>=4.2.5', '[]']
  adding ['mccabe', '', '[]']
  adding ['six', '', '[]']
Removed dependencies in this round:
Unsafe dependencies in this round:
------------------------------------------------------------
Result of round 1: not stable

                          ROUND 2                           
Current constraints:
  astroid<2.0,>=1.6
  isort>=4.2.5
  mccabe
  pylint
  six

Finding the best candidates:
  found candidate astroid==1.6.4 (constraint was >=1.6,<2.0)
  found candidate isort==4.3.4 (constraint was >=4.2.5)
  found candidate mccabe==0.6.1 (constraint was <any>)
  found candidate pylint==1.9.1 (constraint was <any>)
  found candidate six==1.11.0 (constraint was <any>)

Finding secondary dependencies:
  pylint==1.9.1             requires astroid<2.0,>=1.6, isort>=4.2.5, mccabe, six
  astroid==1.6.4            requires lazy-object-proxy, six, wrapt
  isort==4.3.4              requires -
  mccabe==0.6.1             requires -
  six==1.11.0               requires -

New dependencies found in this round:
  adding ['lazy-object-proxy', '', '[]']
  adding ['wrapt', '', '[]']
Removed dependencies in this round:
Unsafe dependencies in this round:
------------------------------------------------------------
Result of round 2: not stable

                          ROUND 3                           
Current constraints:
  astroid<2.0,>=1.6
  isort>=4.2.5
  lazy-object-proxy
  mccabe
  pylint
  six
  wrapt

Finding the best candidates:
  found candidate astroid==1.6.4 (constraint was >=1.6,<2.0)
  found candidate isort==4.3.4 (constraint was >=4.2.5)
  found candidate lazy-object-proxy==1.3.1 (constraint was <any>)
  found candidate mccabe==0.6.1 (constraint was <any>)
  found candidate pylint==1.9.1 (constraint was <any>)
  found candidate six==1.11.0 (constraint was <any>)
  found candidate wrapt==1.10.11 (constraint was <any>)

Finding secondary dependencies:
  astroid==1.6.4            requires lazy-object-proxy, six, wrapt
  wrapt==1.10.11            requires -
  lazy-object-proxy==1.3.1  requires -
  six==1.11.0               requires -
  pylint==1.9.1             requires astroid<2.0,>=1.6, isort>=4.2.5, mccabe, six
  mccabe==0.6.1             requires -
  isort==4.3.4              requires -
------------------------------------------------------------
Result of round 3: stable, done

Locking [packages] dependenciesโ€ฆ

๋‹ค์Œ์€ pipenv --version . pipenv, ๋ฒ„์ „ 2018.05.18

๋˜ํ•œ ํŠน์ • ์ด์œ /์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ œ ๊ฒฝ์šฐ์—๋Š” pipenv lock ํ•˜๋ฉด ์‹œ์ž‘๋˜์ง€๋งŒ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๋๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 2์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ ค๋„ ์•„์ง ์™„์„ฑ์˜ ๊ธฐ๋ฏธ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์—๊ฒŒ ReadTimeoutError๋ฅผ ๋‘ ๋ฒˆ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ด ์ผ์„ ํ•˜๋Š” ์„ธ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค.
ํŒŒ์ด์ฌ 3.6.4 ์‚ฌ์šฉํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ ๋งˆ๊ฐ์ผ์ด ๊ฐ€๊นŒ์›Œ์ง€๋ฉด ์–ด๋–ค ๋„์›€์ด๋“  ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ์—ด๋ฆฌ๋„๋ก ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค. ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๋‚ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ž ๊ทธ๋Š” ๋ฐ 10-20๋ถ„ ์ •๋„ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์—„์ฒญ๋‚œ ์–‘์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Docker๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ• ๋‹น๋Ÿ‰์„ ๋Š˜๋ ค์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ์†๋„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋„์›€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์˜ˆ์ œ Pipfilesmand ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ์ด๋ฒˆ ์ฃผ์— ๋ฆด๋ฆฌ์Šค๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ๋‹ซํžŒ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๊ฐœ๋ณ„ ๋Œ“๊ธ€์„ ์ถ”์ ํ•  ์‹œ๊ฐ„์ด ์—†์ง€๋งŒ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ Pipfile์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jkp ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž(์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ์ด ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ทธ๋ ‡์ง€๋Š” ์•Š์Œ)๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ๋งค์šฐ ์ž˜ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ๋”๋Š” ์•„๋‹ˆ๋”๋ผ๋„ ๋‹น์‹ ๋งŒํผ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋ณด์ฆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๊ฒฐ์ฝ” ์‰ฌ์šด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ Python ํŒจํ‚ค์ง•์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๋ถ„ํ•ดํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ€๋Šฅํ•œ ํ•œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋ฏธ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋˜์กŒ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ๋ฌธ์ œ ์—๋„ ์ง‘์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‚ด๊ฐ€ ๋‚ด๋ ค์•ผ ํ•  ๋ถˆ๊ฐ€ํ”ผํ•œ ๊ฒฐ์ •์€ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๊ณ  ํ•ด๊ฒฐํ•œ ํ›„์—์•ผ ๋‹ค์Œ ๋‹จ๊ณ„์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์—ฌ ๋…ธ๋ ฅ์˜ ํšจ๊ณผ๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๊ท€ํ•˜์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์šฐ๋ฆฌ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ์„ ์ถฉ๋ถ„ํžˆ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ์›Œํฌํ”Œ๋กœ์—์„œ ๊ฐ€์žฅ ํฐ ๋‹จ์ผ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋กœ ๊ผฝ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ท€ํ•˜๊ฐ€ ์ด ๋„๊ตฌ์˜ ์œ ์ผํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์šฐ๋ฆฌ๋Š” ๊ท€ํ•˜๋ณด๋‹ค ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ํ•„์š”, ์‹ฌ์ง€์–ด ์šฐ๋ฆฌ ์ž์‹ ์˜ ํ•„์š”๋ฅผ ์šฐ์„ ์‹œํ•ด์•ผ ํ•จ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ณต์œ ํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜๊ณ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๊ฒŒ ๋˜๋ฉด, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋Š” ๋‹ซํžŒ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋ฉฐ, ๋ฌธ์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฌธ์ œ ์ถ”์ ๊ธฐ์—์„œ ๋…ธ์ด์ฆˆ ์—ญํ• ๋งŒ ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ์šฐ๋ฆฌ์˜ ์ž‘์—… ํ๋ฆ„์—์„œ๋Š” ์•„๋ฌด๋„ ์ž‘์—…ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์›Œํฌํ”Œ๋กœ๋ฅผ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์š”์ฒญ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด pipenv ์™€ net ์‚ฌ์ด์— mitmproxy ๋ฅผ ์„ค์น˜ํ•˜์—ฌ ๋””๋ฒ„๊น…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ์•„์ง json-api ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋น„๊ณต๊ฐœ pypi ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํด๋ฐฑ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋“ฑ์„ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด http ์ธ๋ฑ์Šค์— ๋‚˜์—ด๋œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…ํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—… ์†๋„๊ฐ€ ํฌ๊ฒŒ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€ ์ œ์•ˆ์€ ์ด ํด๋ฐฑ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ ์ค‘์ž„์„ ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋กœ๊น…์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์„ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค ํ•„์š”๊ฐ€ ์—†๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ ์•„ํ‚คํ…์ฒ˜์™€ ๊ด€๋ จ์ด ์—†๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Linux ์‹œ์Šคํ…œ์—์„œ win32 ๋˜๋Š” osx ํŠน์ • ํœ  ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜์šฉ์œผ๋กœ ๋นŒ๋“œ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋ฌด ์†Œ์šฉ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ง€ํ•˜๊ณ  ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ณ„์†ํ•ด์„œ ๋””๋ฒ„๊ทธํ•˜๊ณ  ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ฐพ๋Š” ๋Œ€๋กœ ๋‹ค์‹œ ๋ณด๊ณ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

pipenv ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” json ์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋„ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜์™€ ๊ด€๋ จ๋œ ํœ  ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์€ ํ˜„์žฌ ๋Œ€์ƒ ํ”Œ๋žซํผ/์•„์น˜์— ๊ด€๊ณ„์—†์ด ์ฃผ์–ด์ง„ ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด ๋‚˜์—ด๋œ ๋ชจ๋“  ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•œ๋‹ค๋Š” ์ ์—์„œ ๋งค์šฐ ์ˆœ์ง„ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์†Œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค:

Linux ํ˜ธ์ŠคํŠธ: pipenv install grpcio

๋‹ค์Œ ์š”์ฒญ์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค( mitmproxy ์‚ฌ์šฉํ•˜์—ฌ ์บก์ฒ˜).

$ mitmdump -w dump.out
Proxy server listening at http://*:8080
127.0.0.1:62303: clientconnect
127.0.0.1:62303: GET https://pypi.org/simple/setuptools/
              << 200 OK 79.82k
127.0.0.1:62305: clientconnect
127.0.0.1:62305: GET https://files.pythonhosted.org/packages/7f/e1/820d941153923aac1d49d7fc37e17b6e73bfbd2904959fffbad77900cf92/setuptools-39.2.0-py2.py3-none-any.whl
              << 200 OK 554.25k
127.0.0.1:62303: GET https://pypi.org/simple/pip/
              << 200 OK 9.56k
127.0.0.1:62303: GET https://pypi.org/simple/wheel/
              << 200 OK 6.91k
127.0.0.1:62303: clientdisconnect
127.0.0.1:62305: clientdisconnect
127.0.0.1:62307: clientconnect
127.0.0.1:62307: GET https://pypi.org/simple/grpcio/
              << 200 OK 112.03k
127.0.0.1:62309: clientconnect
127.0.0.1:62309: GET https://files.pythonhosted.org/packages/1f/ea/664c589ec41b9e9ac6e20cc1fe9016f3913332d0dc5498a5d7771e2835af/grpcio-1.12.1-cp36-cp36m-manylinux1_x86_64.whl
              << 200 OK 8.57m
127.0.0.1:62307: GET https://pypi.org/simple/six/
              << 200 OK 3.34k
127.0.0.1:62309: GET https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl
              << 200 OK 10.45k
127.0.0.1:62309: clientdisconnect
127.0.0.1:62307: clientdisconnect
127.0.0.1:62311: clientconnect
127.0.0.1:62311: GET https://pypi.org/simple/grpcio/
              << 200 OK 112.03k
127.0.0.1:62313: clientconnect
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/1f/ea/664c589ec41b9e9ac6e20cc1fe9016f3913332d0dc5498a5d7771e2835af/grpcio-1.12.1-cp36-cp36m-manylinux1_x86_64.whl
              << 200 OK 8.57m
127.0.0.1:62311: GET https://pypi.org/simple/six/
              << 200 OK 3.34k
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl
              << 200 OK 10.45k
127.0.0.1:62315: clientconnect
127.0.0.1:62315: GET https://pypi.org/pypi/six/json
              << 200 OK 5.94k
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz
              << 200 OK 29.16k
127.0.0.1:62315: GET https://pypi.org/pypi/grpcio/json
              << 200 OK 164.26k
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/5c/73/5e65b81301956bdd32c5e8da691fde3fbd6e61283b65d2bac590b8f43765/grpcio-1.12.1-cp27-cp27m-win32.whl
              << 200 OK 1.35m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/e1/c3/bcce8247da4e6f95a900489b6f7ff3d14d93df40d69875fe4164c1b9544a/grpcio-1.12.1-cp27-cp27mu-manylinux1_i686.whl
              << 200 OK 8.01m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/ed/89/03924c56e9044b0842a014fcc0a81f55975028d1caa9cdd14234a230bc70/grpcio-1.12.1-cp27-cp27m-win_amd64.whl
              << 200 OK 1.35m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/d7/f6/ddeab13c25b8451f05875587801ad87e4e0fc23c4e3eb328c4bd1a80a415/grpcio-1.12.1-cp36-cp36m-linux_armv7l.whl
              << 200 OK 7.77m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/2d/a4/4d1d73c0339e987ea173f44cf62ec6b40fb91e0336c09c960c4a44137552/grpcio-1.12.1-cp35-cp35m-linux_armv7l.whl
              << 200 OK 7.76m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/76/27/b03ec8fc96745cde68d6ec29115f9a444945a6acc45209c5772378cc4d66/grpcio-1.12.1-cp35-cp35m-macosx_10_7_intel.whl
              << 200 OK 1.83m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/30/24/8e247548321e52c266a639b51a838ec19b41fb6bfd27e3bbef018496752e/grpcio-1.12.1-cp27-cp27m-manylinux1_x86_64.whl
              << 200 OK 8.47m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/80/c9/e582b962a4a3aa2684666ff67fc994a042b1b0e444eb6672eb9740f7b59a/grpcio-1.12.1-cp34-cp34m-macosx_10_7_intel.whl
              << 200 OK 1.84m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/a2/25/6d910070a4a07c32633c2376075d5dc03e90f69f855d700e3f73c1affebb/grpcio-1.12.1-cp27-cp27m-macosx_10_12_x86_64.whl
              << 200 OK 1.57m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/33/38/58f3e8d133de1f2e911206ead03799621205079c303ae5b27e7350051f4a/grpcio-1.12.1.tar.gz
              << 200 OK 13.56m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/68/57/da122cbfc1b7815381480b23044fff06b90f58c1be9310e68c2d6b1d623c/grpcio-1.12.1-cp36-cp36m-macosx_10_7_intel.whl
              << 200 OK 1.82m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/c6/b8/47468178ba19143e89b2da778eed660b84136c0a877224e79cc3c1c3fd32/grpcio-1.12.1-cp35-cp35m-manylinux1_x86_64.whl
              << 200 OK 8.55m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/5d/8b/104918993129d6c919a16826e6adcfa4a106c791da79fb9655c5b22ad9ff/grpcio-1.12.1-cp36-cp36m-win_amd64.whl
              << 200 OK 1.37m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/94/6c/02e9cb803cd7b9608c9c1768d86d31c61b088f5b9513a203c10fa7e905d8/grpcio-1.12.1-cp36-cp36m-win32.whl
              << 200 OK 1.12m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/2a/ed/71169dccb7f9250d17031068579832371a72891d8e64891265370ca6e264/grpcio-1.12.1-cp27-cp27mu-linux_armv7l.whl
              << 200 OK 7.68m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/63/38/d73bf5b1ef950dbab8203122b9681137b35012492ecfec56719be109e343/grpcio-1.12.1-cp27-cp27m-manylinux1_i686.whl
              << 200 OK 8.01m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/13/71/87628a8edec5bffc86c5443d2cb9a569c3b65c7ff0ad05d5e6ee68042297/grpcio-1.12.1-cp36-cp36m-manylinux1_i686.whl
              << 200 OK 8.11m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/1d/0d/146582f71161a0074dda2378617ae5f7e2c3d6cf62d4588eb586c1d6b675/grpcio-1.12.1-cp27-cp27mu-manylinux1_x86_64.whl
              << 200 OK 8.47m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/9e/3a/6aceb4fccacf6d2d7d087190c221a90f14b2bdcb56cbee5af24b7050278b/grpcio-1.12.1-cp34-cp34m-win_amd64.whl
              << 200 OK 1.35m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/f9/fa/a0187d220544b744dd3bb0d8b8ec716d130159160bf627415b2880ae599a/grpcio-1.12.1-cp34-cp34m-win32.whl
              << 200 OK 1.35m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/dd/aa/ac8e3c6badf1744f04be7d35fa95dae56df12b956f861285c8cced2a22cb/grpcio-1.12.1-cp34-cp34m-linux_armv7l.whl
              << 200 OK 7.76m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/38/2a/94665daafbcf0214adcf77ad8f5aed8b9dfcbfa871115c7890d88b1b8f3c/grpcio-1.12.1-cp34-cp34m-manylinux1_x86_64.whl
              << 200 OK 8.58m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/0d/33/22ad4a9dcefe330180cdb2d24fdd980af2a7a2dc03af208a408fd48195e0/grpcio-1.12.1-cp35-cp35m-win_amd64.whl
              << 200 OK 1.36m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/b5/13/9e8e5d68a15c51b251e512955a971214fd8425b237e6d6a04f0257c5d090/grpcio-1.12.1-cp34-cp34m-manylinux1_i686.whl
              << 200 OK 8.11m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/21/41/66ab386c65be68b4e907f2cd35223965aea2a086bcd0bd6825999e0bda7c/grpcio-1.12.1-cp35-cp35m-win32.whl
              << 200 OK 1.12m
127.0.0.1:62313: GET https://files.pythonhosted.org/packages/f7/db/fc084f59804a32a8d6efb467896a505f4dc93ea89ec44da856b91f05a5cb/grpcio-1.12.1-cp35-cp35m-manylinux1_i686.whl
              << 200 OK 8.09m
127.0.0.1:62313: clientdisconnect
127.0.0.1:62311: clientdisconnect
127.0.0.1:62315: clientdisconnect

์ผ๋ถ€ ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ ๊ณ„์‚ฐ:

  • 4 x win32
  • 4 x ํŒ”
  • 4 x ๋งˆ์ฝ”์Šค

๊ธฐํƒ€ ํ˜ธ์ŠคํŠธ ์šด์˜ ์ฒด์ œ ๋ฐ ์•„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ„๋‹จํ•œ ํ•„ํ„ฐ๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅธ ์Šน๋ฆฌ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๊นŒ?

ํ˜ธ์ŠคํŠธ ๋ฐ ์•„ํ‚คํ…์ฒ˜๋ณ„๋กœ ํ•„ํ„ฐ๋ง๋œ ํ•ญ๋ชฉ์„ ์›ํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ํ˜ธ์ŠคํŠธ ๋ฐ ์•„ํ‚คํ…์ฒ˜์— ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ด์‹œ๊ฐ€ ํฌํ•จ๋œ ์ž ๊ธˆ ํŒŒ์ผ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ์†Œ์‹)

JSON API์™€ ๊ด€๋ จํ•˜์—ฌ ํ˜„์žฌ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์‹ค์ œ๋กœ ์ง์ ‘ ์ ์ค‘ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ฆด๋ฆฌ์Šคํ•˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋‹ค์‹œ ๋น„ํ™œ์„ฑํ™”ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ๊ด‘๋ฒ”์œ„ํ•œ ํ”„๋กœํŒŒ์ผ๋ง์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ packaging.version.parse() ๋Œ€ํ•œ ์‹คํŒจํ•œ ํ˜ธ์ถœ์ด pipenv ๋Ÿฐํƒ€์ž„์˜ 20-50% ์ •๋„๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Pip 10์€ ๊ธฐ๋ณธ์ ์œผ๋กœ JSON API๋ฅผ ๊ธฐ๋ณธ ํ™•์ธ์ž๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ pip ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ทธ ์•ž์—์„œ ํ•  ์ผ์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๊ฑธ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ฃ ?

ํ† ๋ก ์„ #2284๋กœ ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋Š๋ฆฐ ์ž ๊ธˆ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค( install ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ TOML ์กฐ์ž‘ + lock + sync ). ์„ค์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‹จ์ผ ์•„์น˜์— ๋Œ€ํ•œ ์ž ๊ธˆ๊ณผ ๊ด€๋ จํ•˜์—ฌ. ๋””์ž์ธ ์„ ํƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ˜ธ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด์„œ๋งŒ ์ž ๊ธ€ ์ˆ˜ ์žˆ๋„๋ก ํ”Œ๋ž˜๊ทธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์‹œ๊ฐ„๊ณผ ์ผ๋ถ€ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๋Œ€์—ญํญ ์ธก๋ฉด์—์„œ ์ƒ๋‹นํžˆ ์ค‘์š”ํ•œ ์ตœ์ ํ™”๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@techalchemy ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. packaging.version.parse() ์ฐพ๊ธฐ๊ฐ€ ์ข‹์€ ๋ฆฌ๋“œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์ง„์ˆ ์— ๋” ๋งŽ์€ ์ƒ‰์ƒ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

JSON API์™€ ๊ด€๋ จํ•˜์—ฌ ํ˜„์žฌ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์‹ค์ œ๋กœ ์ง์ ‘ ์ ์ค‘ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ฆด๋ฆฌ์Šคํ•˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋‹ค์‹œ ๋น„ํ™œ์„ฑํ™”ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

์™œ ๋น„ํ™œ์„ฑํ™” ํ•  ๊ณ„ํš์ธ์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

@jkp JSON API์™€ ๊ด€๋ จํ•˜์—ฌ ๊ฐ€์žฅ ์ž˜ ์„ค๊ณ„๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ฐ„๋‹จํ•œ API ๊ฐ€ ํ›จ์”ฌ ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด API๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ„๋‹จํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Pyspark๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
๋งˆ์ด ํ•ํŒŒ์ผ -

[[source]]
name = "pypi"
verify_ssl = true
url = "https://pypi.org/simple"

[dev-packages]
pylint = "*"
pyspark = "*"

[requires]
python_version = "3.5"

์‰˜ ์ถœ๋ ฅ -

Pipfile.lock not found, creating...
Locking [dev-packages] dependencies...

์œ„์˜ ๋งˆ์ง€๋ง‰ ์ค„์—์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
15~20๋ถ„ ํ›„ ์ข…๋ฃŒ

pipenv, ๋ฒ„์ „ 2018.7.1

@keshavkaul PySpark๋Š” ๋งค์šฐ ์ปค์„œ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฝค ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ์ฃผ๋ฉด ๋‚˜์ค‘์— ํ›จ์”ฌ ๋‚˜์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค(Pipenv๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์—).

(๋˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํœ  ๋ฐฐํฌํŒ์„ ์ถœ์‹œํ•˜๋„๋ก ์ด‰๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•ฝ๊ฐ„์˜ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

ํ–ฅํ›„ ๋ฐฉ๋ฌธ์ž๋ฅผ ์œ„ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ: ๋Š๋ฆฐ ์„ค์น˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฒŒ์‹œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ๋Š๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค. ๋Š๋ฆฐ ์ด์œ ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ฒฐ๊ณผ๋Š” ์ด ์ฃผ์ œ์— ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‹ค์šด๋กœ๋“œ ์ค‘์— apt-get ๋˜๋Š” wget(๋‹ค์šด๋กœ๋“œ ์†๋„, ๋‹ค์šด๋กœ๋“œํ•œ ํฌ๊ธฐ, ์ด ํฌ๊ธฐ)๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ •๋ณด ๋˜๋Š” ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๋‚˜๋Š” ์ด๊ฒƒ์ด ์—ฌ๊ธฐ์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. pipenv๋Š” ์ €์—๊ฒŒ ๋Š๋ฆฐ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‹ค์šด๋กœ๋“œ์˜€์Šต๋‹ˆ๋‹ค. pipenv๊ฐ€ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์žˆ๊ณ  ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œ๋˜์—ˆ๋Š”์ง€, ์–ด๋–ค ์†๋„์ธ์ง€ ๋“ฑ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์—ด์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

hava ๋™์ผํ•œ ๋ฌธ์ œ: Locking [packages] dependencies... ์˜์›ํžˆ ์ค‘๋‹จ
๋‚ด ํ™˜๊ฒฝ:

  • macOS ํ•˜์ด ์‹œ์—๋ผ 10.13.6
  • ํŒŒ์ด์ฌ: ํŒŒ์ด์ฌ 3.6.4
  • pipenv: ๋ฒ„์ „ 2018.7.1

@crifan ์ž ๊ธˆ ์†๋„๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” ์—ด๋ ค ์žˆ๊ฑฐ๋‚˜ ๋‹ซํ˜€ ์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์ œ์— ๋™์ผํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ฐ™์€ ๋ง์„ ๋ช‡ ๋ฒˆ์ด๋“  ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์˜ ์˜๊ฒฌ์„ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜๊ณ  ์‹ถ๋‹ค๋ฉด ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. "๋‚˜๋„"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์ด์Šˆ ํŠธ๋ž˜์ปค์— ํŠธ๋ž˜ํ”ฝ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์ ์— ์œ ์˜ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. Pipenv๋Š” ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค.
์ž ๊ทธ๊ณ  ์„ค์น˜ํ•˜๋Š” ๋ฐ 1์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ์—์„œ ์ž˜ ๋‹ต๋ณ€๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. https://github.com/pypa/pipenv/issues/1914#issuecomment -378846926

Python ์ข…์†์„ฑ์€ ํ•ด๊ฒฐ ๋ฐ ๊ณ„์‚ฐ์„ ์œ„ํ•ด ๊ฐ ํŒจํ‚ค์ง€์˜ ์„ค์ • ํŒŒ์ผ์„ ์™„์ „ํžˆ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ํ˜„์‹ค์ด๊ณ  ์กฐ๊ธˆ ๋Š๋ฆฝ๋‹ˆ๋‹ค. 2๋ถ„์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ ˆ์ถฉํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์–ธ์ œ๋“ ์ง€ --skip-lock ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • @techalchemy์— ์˜ํ•ด

์ง์ ‘ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  PyPI API์—์„œ ํ•ด์‹œ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

pipenv๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ง„์ „์ด ์žˆ์œผ๋ฉด ๊ธฐ๋ปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. --skip-lock์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

pipenv๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ง„์ „์ด ์žˆ์œผ๋ฉด ๊ธฐ๋ปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. --skip-lock์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ๋‹ค

Windows์—์„œ Git Bash๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Powershell์— ๋น„ํ•ด ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ํ†ต๊ณ„๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์ง€๋งŒ PS๊ฐ€ ๋” ๋น ๋ฅธ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Git Bash๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ pipenv 'ing์— ๋Œ€ํ•ด ๊ธฐ๋ณธ PS๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ํŒฌ๋”๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋™์•ˆ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์ถœ๋ ฅ์€ ์ด์ชฝ

pipenv install pandas --verbose
Installing pandasโ€ฆ
โ ‹ Installing...Installing 'pandas'
$ ['/Users/sinscary/.local/share/virtualenvs/signzy-MSzur11z/bin/pip', 'install', '--verbose', '--upgrade', 'pandas', '-i', 'https://pypi.org/simple']
Adding pandas to Pipfile's [packages]โ€ฆ
โœ” Installation Succeeded
Pipfile.lock not found, creatingโ€ฆ
Locking [dev-packages] dependenciesโ€ฆ
Locking [packages] dependenciesโ€ฆ
โ ฆ Locking...

30๋ถ„ ์ด์ƒ ์ž ๊ธˆ ์ƒํƒœ์—์„œ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ์ €๋Š” ํŒŒ์ด์ฌ 3.7.0, macos mojave๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ž ๊ธˆ ๋‹จ๊ณ„ ์ค‘๋‹จ์œผ๋กœ ์ธํ•ด pipenv๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋„์ปค ์ด๋ฏธ์ง€๋Š” ๋‚ด ๋žฉํ†ฑ(i7/16Gb)์—์„œ ๋นŒ๋“œํ•˜๋Š” ๋ฐ 30๋ถ„ ์ด์ƒ ๊ฑธ๋ฆฌ๋ฉฐ pipenv install ... ๋ช…๋ น์€ ์˜ค๋ž˜ ๋™์•ˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค...

Dockerfile

FROM python:3.7-alpine

# Update package list.
RUN set -ex && apk update

# Install apk dependencies.
RUN set -ex && apk add --no-cache musl-dev gcc libffi-dev openssl-dev make

# Install Pipenv.
RUN set -ex && pip install pipenv --upgrade

# Copy Pipfiles.
RUN mkdir /website
COPY Pipfile /website

# Install Pipenv dependencies.
WORKDIR /website
RUN set -ex && pipenv install --system --skip-lock --verbose

Pipfile

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"


[requires]
python_version = "3.7"

[packages]
sanic = "*"
jinja2 = "*"
asyncpg = "*"
uvloop = "*"
munch = "*"

[dev-packages]

[pipenv]
allow_prereleases = true

์ด๊ฒŒ ์ •์ƒ์ธ๊ฐ€์š”? ๋ˆ„๊ตฐ๊ฐ€ ์žฌ์ƒ์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—…๋ฐ์ดํŠธ: Alpine Linux

๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ pipenv ์˜ ์ชฝ์— ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค ...

Alpine ๊ธฐ๋ฐ˜ docker-image๋ฅผ Debian-Slim ์— ๊ตฌ์ถ•๋œ ๊ฒƒ์œผ๋กœ ๊ต์ฒดํ–ˆ์œผ๋ฉฐ ์ด์ œ pipenv install ๊ฐ€ ๋ช‡ ์ดˆ ์•ˆ์— ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๋‚ด ์˜ˆ์˜ ๋ฌธ์ œ๋Š” Alpine Linux๊ฐ€ ํ•ญ์ƒ ์†Œ์Šค์—์„œ cython-extension ๋˜๋Š” c-extensions ๋ฅผ ํฌํ•จํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š”๋ฐ, ์ด๋Š” Docker ์ปจํ…Œ์ด๋„ˆ์—์„œ ์˜์›ํžˆ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด Debian Linux๋Š” wheel ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด: https://stackoverflow.com/questions/49037742/why-does-it-take-ages-to-install-pandas-on-alpine-linux

๋‚˜๋Š” ์˜ค๋žซ๋™์•ˆ pipenv๋ฅผ ๋– ๋‚ฌ๊ณ  "venv"๋˜๋Š” ๋‹ค๋ฅธ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค.

์ด์ƒํ•œ ์†๋„ ๋ฌธ์ œ๋„ ์žˆ๊ณ  ์ผ๋ถ€ ์Šคํฌ๋ฆฝํŒ…์— ๋Œ€ํ•ด 2๊ฐœ์˜ ๋ชจ๋“ˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

click

์„ค์น˜ํ•˜๋Š” ๋ฐ 15/20๋ถ„์ด ๊ฑธ๋ ธ๊ณ  60Mbps ์ด์ƒ์˜ ๋‹ค์šด ์†๋„์™€ ์ตœ์‹  MacBook Pro 2019(๋‚ด๊ฐ€ ์„ ํƒํ•œ ํ•˜๋“œ์›จ์–ด๊ฐ€ ์•„๋‹˜)์—์„œ ์‹คํ–‰๋˜๋Š” ์ธํ„ฐ๋„ท ํ…Œ์ŠคํŠธ.

๋‹น๋ถ„๊ฐ„ virtualenv๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์ œ๊ณต๋  ๋•Œ๊นŒ์ง€

๋‚ด๊ฐ€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ„์˜ 99%๋Š” ์ข…์†์„ฑ์ด ๋‚ด ์ž ๊ธˆ ํŒŒ์ผ์˜ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‚ด ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ผ๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์‹คํ–‰ ์ดํ›„์— ์ƒˆ๋กœ์šด ์—…์ŠคํŠธ๋ฆผ ํŒจํ‚ค์ง€๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ™•์‹คํžˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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