Virtualenv: ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์—์„œ ์ž˜๋ชป๋œ shebang์œผ๋กœ ์„ค์น˜๋œ ์Šคํฌ๋ฆฝํŠธ

์— ๋งŒ๋“  2016๋…„ 01์›” 20์ผ  ยท  27์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pypa/virtualenv

2.7.10์ด ์•„๋‹Œ Python 3.5.1์—์„œ virtualenv์˜ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ตํ•ด pip๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž˜๋ชป๋œ shebang์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ์‹คํ–‰์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

$ cat > invoke.py
import sys
import subprocess

subprocess.Popen(sys.argv[1:]).wait()
$ rm -Rf env
$ python -m virtualenv --version
14.0.0
$ python --version
Python 3.5.1
$ python -m virtualenv env
Using base prefix '/Library/Frameworks/Python.framework/Versions/3.5'
New python executable in /Users/jaraco/Dropbox/code/public/aspen/env/bin/python3
Also creating executable in /Users/jaraco/Dropbox/code/public/aspen/env/bin/python
Installing setuptools, pip, wheel...done.
$ python invoke.py env/bin/pip install pytest
Collecting pytest
  Using cached pytest-2.8.5-py2.py3-none-any.whl
Collecting py>=1.4.29 (from pytest)
  Using cached py-1.4.31-py2.py3-none-any.whl
Installing collected packages: py, pytest
Successfully installed py-1.4.31 pytest-2.8.5
$ head -n 1 env/bin/py.test
#!/Library/Frameworks/Python.framework/Versions/3.5/bin/python3

py.test ์Šคํฌ๋ฆฝํŠธ์—๋Š” 'env'๊ฐ€ ํฌํ•จ๋œ shebang์ด ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋Œ€์‹  pyvenv๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ์˜ ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ณด๊ณ ๋œ ๋Œ€๋กœ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— __PYVENV_LAUNCHER__ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด ๋ฌธ์ œ๋Š” 13.1.2 ๋ฐ 14.0.0์—์„œ ๊ด€์ฐฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋™์ž‘์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ ์ ˆํ•œ ์ž‘์—…์ž…๋‹ˆ๊นŒ?

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

๋‚˜๋Š”์ด ์ •ํ™•ํ•œ ๋ฒ„๊ทธ์— ๋ฌผ๋ ธ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ๋งค์šฐ ์‹ฌ๊ฐํ•œ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์ด ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ์–ธ์ œ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

ํ•˜๋‹ค

$ env/bin/pip uninstall pytest
$ env/bin/pip install pytest
$ head -n 1 env/bin/py.test

๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๊ฐ™์€ ์งˆ๋ฌธ

$ env/bin/python -m pip install pytest

?

https://github.com/pypa/virtualenv/issues/322 / https://github.com/pypa/virtualenv/pull/541 ์—์„œ ํšŒ๊ท€ ๊ฐ€๋Šฅ์„ฑ์ด

์–ด๋–ค ๊ฒฝ์šฐ์ธ์ง€ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

subprocess.Popen(sys.argv[1:], env={}).wait()

๋„์›€์ด ๋˜๋“  ๋ง๋“ ?

ํ , pip / distlib์— ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ 1๋…„ ์ „์— ์ฃผ์„ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/pypa/pip/blob/7cea748d0fb2e8980c2676304607426585550b41/pip/_vendor/distlib/util.py#L157 -L165

๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ?

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ pip๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ์ ์ ˆํ•œ shebang์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

$ env/bin/pip install pytest
Collecting pytest
  Using cached pytest-2.8.5-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): py>=1.4.29 in ./env/lib/python3.5/site-packages (from pytest)
Installing collected packages: pytest
Successfully installed pytest-2.8.5
$ head -n 1 env/bin/py.test
#!/Users/jaraco/Dropbox/code/public/aspen/env/bin/python3
$ env/bin/pip uninstall -y pytest
Uninstalling pytest-2.8.5:
  Successfully uninstalled pytest-2.8.5
$ env/bin/python -m pip install pytest
Collecting pytest
  Using cached pytest-2.8.5-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): py>=1.4.29 in ./env/lib/python3.5/site-packages (from pytest)
Installing collected packages: pytest
Successfully installed pytest-2.8.5
$ head -n 1 env/bin/py.test
#!/Users/jaraco/Dropbox/code/public/aspen/env/bin/python

๋˜ํ•œ ๋นˆ env๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

$ cat invoke.py 
import sys
import os
import subprocess

env = dict(os.environ)
env.pop('__PYVENV_LAUNCHER__')
env = {}

subprocess.Popen(sys.argv[1:], env=env).wait()
$ python -m virtualenv env
Using base prefix '/Library/Frameworks/Python.framework/Versions/3.5'
New python executable in /Users/jaraco/Dropbox/code/public/aspen/env/bin/python3
Also creating executable in /Users/jaraco/Dropbox/code/public/aspen/env/bin/python
Installing setuptools, pip, wheel...done.
$ python invoke.py env/bin/pip install pytest
Collecting pytest
  Using cached pytest-2.8.5-py2.py3-none-any.whl
Collecting py>=1.4.29 (from pytest)
  Using cached py-1.4.31-py2.py3-none-any.whl
Installing collected packages: py, pytest
Successfully installed py-1.4.31 pytest-2.8.5
$ head -n 1 env/bin/py.test
#!/Users/jaraco/Dropbox/code/public/aspen/env/bin/python3

commit ์— ๋”ฐ๋ฅด๋ฉด ํ•ด๋‹น ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ pip 6.0์—์„œ ๋ฆด๋ฆฌ์Šค๋œ distlib 0.2.0์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ค๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ปค๋ฐ‹์€ pip 2031 ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ homebrew๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ python.org Mac ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ Python์„ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ $ python ๊ฐ€ __VENV_LAUNCHER__ ํ•˜๊ณ  ๊ทธ ํ›„ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ/์‹คํ–‰ ํŒŒ์ผ์„ ์†์ด๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ "์˜ˆ์ƒ"๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” "์†์ž„์ˆ˜"์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€ ๋””๋ฒ„๊ทธํ•  OS X์ด ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ #620์—์„œ ๋ณด๊ณ ๋œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ/๋™์ผํ•œ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jaraco ๊ฐ€์ƒ ํ™˜๊ฒฝ ์—์„œ pip ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์–ธ๊ธ‰๋œ distlib ํ–‰์˜ ์ฃผ์„ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ž‘์„ฑํ•  ์ž˜๋ชป๋œ ํŒŒ์ด์ฌ์„ ์„ ํƒํ•˜๋Š” pip์˜ ๋™์ž‘์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ venv ๊ฐ์ง€ ์ฝ”๋“œ๋ฅผ ์ด ์ปค๋ฐ‹์œผ๋กœ ๋‹ค์‹œ ์ถ”์ ํ–ˆ๋Š”๋ฐ ๋ถˆํ–‰ํžˆ๋„ ์•„์ด๋””์–ด์˜ ๊ธฐ์›์„ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์„ค๋ช…์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜์˜ ์„ฑํ–ฅ์€ Ronald๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌ

@vsajip ์กฐ์–ธ์„ ์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ:

  • __PYVENV_LAUNCHER__ ์ดํ›„ ๋ฒ„์ „ (๋กœ๋„๋“œ์— ๋”ฐ๋ฅด๋ฉด, <3.3) ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ ์ด์ „ ๋ฒ„์ „์˜ ์ถ”๊ฐ€๊ฐ€ ์•„๋‹Œ ํ•œ, ํŒŒ์ด์ฌ์˜ site.py OS X ํ”„๋ ˆ์ž„ ์›Œํฌ ์‹คํ–‰์—์„œ ์Šคํ… ๋ฐœ์‚ฌ๋Œ€์˜ ์œ„์น˜๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”์—. Ned Deily์˜ ์ด ๋Œ“๊ธ€ ์— ๋”ฐ๋ฅด๋ฉด sys.executable ์ด์ œ ์Šคํ… ๋Ÿฐ์ฒ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ ์ด๊ฒƒ์ด distlib ๊ฐ€ __PYVENV_LAUNCHER__ ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ site.py ์—์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ OS X์—์„œ๋Š” pyvenv.cfg ํŒŒ์ผ์„ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด Python 3.4์—์„œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ํšŒ๊ท€์˜ ์ผ์ข…์ธ์ง€ ๋˜๋Š” ๋ชจ๋“  Python >= 3.3์ด ๋™์ผํ•œ ๋™์ž‘์„ ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์ œ ์ƒ๊ฐ์—๋Š” ์–ด๋”˜๊ฐ€์—์„œ ๋ฌด์–ธ๊ฐ€๊ฐ€ os.path.realpath() ํ˜ธ์ถœ์„ ํ•ด์„œ๋Š” ์•ˆ ๋  ๋•Œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. distlib ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (Ned์˜ ์˜๊ฒฌ์— ๋”ฐ๋ผ) sys.executable ์™€ env var๊ฐ€ ํ•ญ์ƒ ๊ฐ™์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌด์–ธ๊ฐ€๊ฐ€ realpath ์— ๋Œ€ํ•ด sys.executable ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด Python์„ ์‹คํ–‰ํ•˜๋ฉด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ—›์†Œ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค( sys.executable ๋Š” ์—ญ์ฐธ์กฐ ๊ฒฝ๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์—).

Homebrew๊ฐ€ https://github.com/Homebrew/homebrew-core/pull/8129 ์—์„œ ์žฌ๋ฐœ๊ฒฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๋ฐ๋ชจ:

$ virtualenv -p python3 test
$ test/bin/python3 -c 'import sys; print(sys.executable)'
/Users/tim/test/bin/python3

$ /usr/local/bin/python3 -c 'import subprocess; subprocess.call(["/Users/tim/test/bin/python3", "-c", "import sys; print(sys.executable)"])'
/usr/local/bin/python3

$ /usr/local/bin/python3 -c 'import subprocess, os; del os.environ["__PYVENV_LAUNCHER__"]; subprocess.call(["/Users/tim/test/bin/python3", "-c", "import sys; print(sys.executable)"])'
/Users/tim/test/bin/python3

๋‚˜๋Š”์ด ์ •ํ™•ํ•œ ๋ฒ„๊ทธ์— ๋ฌผ๋ ธ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ๋งค์šฐ ์‹ฌ๊ฐํ•œ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์ด ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ์–ธ์ œ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๋ฌธ์ œ์˜ ๋” ์‹ฌ๊ฐํ•œ ์ง•ํ›„๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์— ํƒ€๊ฒฉ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

xonsh๋ฅผ ์ผ์ƒ์ ์ธ ์‰˜๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ xonsh์—์„œ virtualenv๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

~ $ cd ~/draft
draft $ virtualenv --version
16.0.0
draft $ virtualenv .env
Using base prefix '/Library/Frameworks/Python.framework/Versions/3.7'
New python executable in /Users/jaraco/draft/.env/bin/python3
Also creating executable in /Users/jaraco/draft/.env/bin/python
Installing setuptools, pip, wheel...done.
draft $ .env/bin/pip install paver
Collecting paver
  Using cached https://files.pythonhosted.org/packages/98/1e/37ba8a75bd77ea56a75ef5ae66fe657b79205bbc36556c9456cd641782a4/Paver-1.3.4-py2.py3-none-any.whl
Collecting six (from paver)
  Using cached https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl
Installing collected packages: six, paver
Successfully installed paver-1.3.4 six-1.11.0
  The script paver is installed in '/Users/jaraco/draft/.env/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
draft $ .env/bin/paver --help
Traceback (most recent call last):
  File ".env/bin/paver", line 7, in <module>
    from paver.tasks import main
ModuleNotFoundError: No module named 'paver'
draft $ head -n 1 .env/bin/paver
#!/Library/Frameworks/Python.framework/Versions/3.7/bin/python3

์„ค์น˜๋œ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ๋Š” virtualenv ์ ‘๋‘์‚ฌ๊ฐ€ ์•„๋‹Œ ์‹œ์Šคํ…œ ์ ‘๋‘์‚ฌ๋ฅผ ์–ป๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์•„๋งˆ๋„ xonsh๊ฐ€ Python 3.7(์‹œ์Šคํ…œ ์ ‘๋‘์‚ฌ)์—์„œ ์‹คํ–‰ ์ค‘์ด๊ณ  env์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

draft $ env | grep LAUNCHER
__PYVENV_LAUNCHER__=/Library/Frameworks/Python.framework/Versions/3.7/bin/python3

๋Œ€์‹  zsh๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋™์ผํ•œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋จผ์ € del $__PYVENV_LAUNCHER__ ํ˜ธ์ถœํ•˜๋ฉด paver๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์‹คํ–‰๋˜๊ณ  shebang ๋ผ์ธ์ด virtualenv๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

xonsh๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ•ด๋‹น ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ง€์›Œ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

https://github.com/python/cpython/pull/9516์— ๊ฐ€๋Šฅํ•œ ๋ฒ„๊ทธ ์ˆ˜์ •์ด

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

Python 3.7.6(Homebrew๋ฅผ ํ†ตํ•ด ์„ค์น˜๋จ)์ด ์„ค์น˜๋œ Mojave์—์„œ ์—ฌ์ „ํžˆ ์ด์™€ ๋™์ผํ•œ ๋™์ž‘์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

rewrite ๋ธŒ๋žœ์น˜๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

@gaborbernat rewrite ๋ถ„๊ธฐ(fbdd782257d8eace7f5440a2b665f2ddb72e9db6)๋ฅผ ๋นŒ๋“œํ•˜๋ ค๊ณ  ํ•˜๋ฉด python3 setup.py build ์—์„œ ๋นŒ๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

...src/virtualenv/__init__.py", line 3, in <module>
    from .version import __version__
ModuleNotFoundError: No module named 'virtualenv.version'

์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

์žฌ์ž‘์„ฑ ๋ถ„๊ธฐ(fbdd782)๋ฅผ ๋นŒ๋“œํ•˜๋ ค๊ณ  ํ•˜๋ฉด python3 setup.py ๋นŒ๋“œ์—์„œ ๋นŒ๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์žฌ์ž‘์„ฑ ๋ถ„๊ธฐ๋Š” ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด pyproject.toml ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ pip๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( pip wheel . .

๋‹น์‹ ์ด ์–ป๋Š” ์˜ค๋ฅ˜๋Š” ๋‚ด๊ฐ€ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ์ƒˆ๋กœ์šด ํ‘œ์ค€ ๋ฐฉ๋ฒ•(PEP-517/518)์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” setuptools ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ธฐ๊ปํ•ด์•ผ setuptools ๋ฒ„๊ทธ์ด์ง€๋งŒ @pfmoore๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด pip๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํœ ์„ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜ virtualenv ํด๋”๋ฅผ ์ง€์ •ํ•˜์—ฌ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค(์ž๋™์œผ๋กœ ํœ ์„ ๋นŒ๋“œํ•˜๊ณ  ํ•œ ๋ฒˆ์— ์„ค์น˜ํ•จ).

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

#!/bin/bash
rm -rf venv-test
virtualenv --python python3 venv-test
python3 -c 'import subprocess; subprocess.check_call(["./venv-test/bin/pip3", "install", "markdown"])'
shebang=$(head -1 venv-test/bin/markdown_py)
expected_shebang="#!$(pwd)/venv-test/bin/python"
if [ "$shebang" == "$expected_shebang" ]; then
    echo "PASSED"
else
    echo "FAILED: \"$shebang\" != \"$expected_shebang\""
    exit 1
fi

์ด๊ฒƒ์€ python3+virtualenv 16.7.9์—์„œ ์‹คํŒจํ•˜๊ณ  python3+virtualenv-16.7.10.dev11+gfbdd782(์ฆ‰, rewrite ๋ถ„๊ธฐ)์—์„œ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

์œ„์™€ ๊ฐ™์ด ์žฌ์ž‘์„ฑ์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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