Virtualenv: рдЙрдкрдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рддрд╣рдд рдЧрд▓рдд рд╢реЗрдмреИрдВрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдЬрдире░ 2016  ┬╖  27рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pypa/virtualenv

рдкрд╛рдпрдерди 3.5.1 рдкрд░, рд▓реЗрдХрд┐рди 2.7.10 рдкрд░ рдирд╣реАрдВ, рдЬрдм рдореИрдВ рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡ рдореЗрдВ рдПрдХ рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рдЗрдк рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЧрд▓рдд рд╢реЗрдмреИрдВрдЧ рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддреА рд╣реИрдВ:

$ 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' рдХреЗ рд╕рд╛рде рдПрдХ рд╢реЗрдмреИрдВрдЧ рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп 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()

рдорджрдж рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ?

рд╣рдореНрдо, рд╢рд╛рдпрдж рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдк/рдбрд┐рд╕реНрдЯрд▓рд┐рдм рдореЗрдВ рдХреЛрдб рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рдереА-

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

рд╕рдорд╛рди, рдпрд╛ рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рджреЗрдВ?

рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, pip рдХреЛ рд╕реАрдзреЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдЙрдЪрд┐рдд рд╢реЗрдмрдВрдЧ рд╣реЛрддрд╛ рд╣реИ:

$ 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

рд╕рд╛рде рд╣реА, рдПрдХ рдЦрд╛рд▓реА рдПрдирд╡реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрд╣реНрд╡рд╛рди рдХрд░рдирд╛:

$ 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

рдХрдорд┐рдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкрд╛рдЗрдк 6.0 рдореЗрдВ рдЬрд╛рд░реА рдбрд┐рд╕реНрдЯрд▓рд┐рдм 0.2.0 рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЙрд╕ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рдереАред

рд╡рд╣ рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдВрджрд░реНрдн pip 2031 ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ python.org рдореИрдХ рдЗрдВрд╕реНрдЯреЙрд▓рд░ рд╕реЗ рдкрд╛рдпрдерди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд╣реЛрдордмреНрд░реЗ рдпрд╛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдирд╣реАрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдЕрдкреЗрдХреНрд╖рд┐рдд" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ $ python __VENV_LAUNCHER__ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЕрдиреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ/рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдпреЛрдВ рдХреЛ рдмреЗрд╡рдХреВрдлрд╝ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореЗрд░реЗ рдкрд╛рд╕ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП OS X рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг" рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рдЪрд▓рддреА рд╣реИред

#620 . рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ рд╕рдорд╛рди / рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ

@jaraco рдпрд╣ рдПрдХ pip рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдбрд┐рд╕реНрдЯрд▓рд┐рдм рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЕрд╕рдореНрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рдЕрдЬрдЧрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдк рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ

рдореИрдВрдиреЗ рдЙрд╕ рд╡реЗрдирд╡ рдбрд┐рдЯреЗрдХреНрд╢рди рдХреЛрдб рдХреЛ рдЗрд╕ рдХрдорд┐рдЯ рдореЗрдВ рд╡рд╛рдкрд╕ рдвреВрдВрдв рд▓рд┐рдпрд╛, рдЬреЛ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХреА рдЙрддреНрдкрддреНрддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдорд┐рд▓рд╛

рдореЗрд░рд╛ рдЭреБрдХрд╛рд╡ рд╡реИрд╕рд╛ рд╣реА рдерд╛ рдЬреИрд╕рд╛ рд░реЛрдирд╛рд▓реНрдб рдиреЗ рдпрд╣рд╛рдВ рд╕реБрдЭрд╛рдпрд╛ рдерд╛ ред

@vsajip рдХреНрдпрд╛ рдЖрдк рдХреЛрдИ рд╕рд▓рд╛рд╣ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреБрдЫ рд╡рд┐рдЪрд╛рд░:

  • __PYVENV_LAUNCHER__ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рдпрдерди рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП (<3.3, рд░реЛрдирд╛рд▓реНрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░) рд▓реЗрдХрд┐рди рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдУрдПрд╕ рдПрдХреНрд╕ рдкрд░ рдкрд╛рдпрдерди рдХреЗ site.py рдХреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдХреНрдЬрд┐рдХреНрдпреВрдЯрд┐рд╡ рд╕реЗ рд╕реНрдЯрдм рд▓реЙрдиреНрдЪрд░ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдиреЗрдб рдбреЗрд▓реА рдХреА рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░, sys.executable рдЕрдм рд╕реНрдЯрдм рд▓реЙрдиреНрдЪрд░ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ distlib рдиреЗ __PYVENV_LAUNCHER__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрдкрдпреЛрдЧ рдЕрдм site.py - рдпрджрд┐ рдЙрдкрд▓рдмреНрдз рд╣реЛ, рддреЛ OS X рдкрд░, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ pyvenv.cfg рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди 3.4, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдЧрдорди рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рд╕рднреА рдкрд╛рдпрдерди> = 3.3 рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдорд╛рди рд╣реИред
  • рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдХреБрдЫ, рдХрд╣реАрдВ, os.path.realpath() рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрдм рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ distlib рдРрд╕рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрдЧрд░ (рдиреЗрдб рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░) sys.executable рдФрд░ env var рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛; рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ realpath sys.executable рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рдпрдерди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╢реЗрдмреИрдВрдЧ рд╣реЛрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ sys.executable рддрдм рдПрдХ рд╕рдВрджрд░реНрднрд┐рдд рдкрде рд╣реЛрдЧрд╛)ред

A(Nother) рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд░рд▓ рдкреНрд░рджрд░реНрд╢рди, рдЬрд┐рд╕реЗ 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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╕реНрдерд╛рдкрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдЙрдкрд╕рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡ рдЙрдкрд╕рд░реНрдЧ рдирд╣реАрдВред

рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕ рддрдереНрдп рд╕реЗ рдЙрдкрдЬрд╛ рд╣реИ рдХрд┐ xonsh рдкрд╛рдпрдерди 3.7 (рд╕рд┐рд╕реНрдЯрдо рдЙрдкрд╕рд░реНрдЧ) рдХреЗ рддрд╣рдд рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ env рдореЗрдВ рд╣реИ:

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

рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп zsh рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╡рд╣реА рдХрдорд╛рдВрдб рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдпрд╛ рдпрджрд┐ рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ del $__PYVENV_LAUNCHER__ рдЖрд╣реНрд╡рд╛рди рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдкреЗрд╡рд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рд╢реЗрдмреИрдВрдЧ рд▓рд╛рдЗрди рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИред

рдХреНрдпрд╛ xonsh рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЙрд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

https://github.com/python/cpython/pull/9516 рдкрд░ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдмрдЧрдлрд┐рдХреНрд╕ рд╣реИ

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдЦреБрд▓рд╛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдмрд╕ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдореИрдВ рдЕрднреА рднреА Mojave рдкрд░ Python 3.7.6 (Homebrew рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд) рдХреЗ рд╕рд╛рде рдпрд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦрддрд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдЖрдк рдкреБрдирд░реНрд▓реЗрдЦрди рд╢рд╛рдЦрд╛ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@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 рдмрд┐рд▓реНрдб рд╕реЗ рдПрдХ рдмрд┐рд▓реНрдб рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред

рдЖрдкрдХреЛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - pip wheel . - рдХреНрдпреЛрдВрдХрд┐ рдкреБрдирд░реНрд▓реЗрдЦрди рд╢рд╛рдЦрд╛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pyproject.toml рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред

рдЖрдкрдХреЛ рдЬреЛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ, рд╡рд╣ рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдЬрдЧрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (PEP-517/518) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдирдП рдорд╛рдирдХ рддрд░реАрдХреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдПрдХ рд╕реЗрдЯрдкреВрд▓ рдмрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ @pfmoore рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдЖрдкрдХреЛ рдкрд╣рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ (рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдкрд╣рд┐рдпрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛)ред

рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдорд╛рдорд▓рд╛:

#!/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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

elfosardo picture elfosardo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

asottile picture asottile  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

schlamar picture schlamar  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

earthgecko picture earthgecko  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zbuc picture zbuc  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ