Pipenv: ๋„์ปค ๋นŒ๋“œ ์ค‘์— pipenv๋กœ ๋‹จ์ผ python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

pipenv run directory/somescript.py๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด PATH์—์„œ directory/somescript.py๋ฅผ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— pipenv๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ์„ค๋ช…
  1. OS ์œ ํ˜• ์šฐ๋ถ„ํˆฌ
  2. ํŒŒ์ด์ฌ ๋ฒ„์ „: $ python -V ํŒŒ์ด์ฌ 3.6
  3. Pipenv ๋ฒ„์ „: $ pipenv --version ๋งˆ์Šคํ„ฐ
์˜ˆ์ƒ ๊ฒฐ๊ณผ

pipenv๋Š” ์ƒ์„ฑ๋œ virtualn ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ๊ฒฐ๊ณผ

26/29๋‹จ๊ณ„: ls $PROJECT_PATH ์‹คํ–‰ | grep setup.py
---> 7811236ec5ee์—์„œ ์‹คํ–‰
setup.py
์ค‘๊ฐ„ ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ 7811236ec5ee
---> ba280fab02c3
27/29๋‹จ๊ณ„: pipenv ์‹คํ–‰ $PROJECT_PATH/setup.py ๊ฐœ๋ฐœ ์‹คํ–‰
---> b48df28fbe12์—์„œ ์‹คํ–‰
์˜ค๋ฅ˜: PATH ๋‚ด์—์„œ /opt/project/setup.py ๋ช…๋ น์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ณต์ œ ๋‹จ๊ณ„

dockerfile์—์„œ ์ถ”์ถœ:
์‹คํ–‰ ls $PROJECT_PATH | grep setup.py
RUN pipenv ์‹คํ–‰ $PROJECT_PATH/setup.py ๊ฐœ๋ฐœ

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

@jacekjab ์Šคํƒ ์ถ”์ ์— ๋ช…์‹œ๋œ ํ•˜์œ„ ์…ธ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Docker ๋‚ด๋ถ€์—์„œ pipenv ์…ธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. pipenv run ๋Š” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜๋Š” shebang์ด ์žˆ๋Š” ๊ฒฝ๋กœ์— ์„ค์น˜๋œ ์Šคํฌ๋ฆฝํŠธ/์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹น์‹ ์ด ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด pipenv run python somescript.py ํ•˜๊ฑฐ๋‚˜ ์Šคํฌ๋ฆฝํŠธ ์ƒ๋‹จ์— shebang์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

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

Dockerfile์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

ENV SHELL=/bin/bash
RUN pipenv shell -c "$PROJECT_PATH/setup.py develop; exit $?"

๊ฒฐ๊ณผ

Spawning environment shell (/bin/bash). Use 'exit' to leave.
Traceback (most recent call last):
  File "/usr/local/bin/pipenv", line 11, in <module>
    load_entry_point('pipenv==9.0.3', 'console_scripts', 'pipenv')()
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/pipenv/cli.py", line 2204, in shell
    do_shell(three=three, python=python, fancy=fancy, shell_args=shell_args)
  File "/usr/local/lib/python3.6/site-packages/pipenv/cli.py", line 2167, in do_shell
    c.interact(escape_character=None)
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/pexpect/pty_spawn.py", line 744, in interact
    mode = tty.tcgetattr(self.STDIN_FILENO)
termios.error: (25, 'Inappropriate ioctl for device')

pipenv run python -c "import this" ( import this ์„ ๋…ผ๋ฆฌ๋กœ ๋Œ€์ฒด)๋กœ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@jacekjab ์Šคํƒ ์ถ”์ ์— ๋ช…์‹œ๋œ ํ•˜์œ„ ์…ธ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Docker ๋‚ด๋ถ€์—์„œ pipenv ์…ธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. pipenv run ๋Š” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜๋Š” shebang์ด ์žˆ๋Š” ๊ฒฝ๋กœ์— ์„ค์น˜๋œ ์Šคํฌ๋ฆฝํŠธ/์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹น์‹ ์ด ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด pipenv run python somescript.py ํ•˜๊ฑฐ๋‚˜ ์Šคํฌ๋ฆฝํŠธ ์ƒ๋‹จ์— shebang์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

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