рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЬрдЧрд░ 2.7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЬ рдпрд╣ рдЬрд╛рдирдХрд░ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ python 2.7 рдХреЗ рд╕рд╛рде рд╕рднреА рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡реА рдореЗрдВ site.py py2.6 рдХреА site.py рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдЬрдЧрд░ 2.7 рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдХрдИ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред
рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ?
site.getsitepackages() рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдУрдПрд╕ рдПрдХреНрд╕ рдкрд░ рдкреБрди: рдЙрддреНрдкрд╛рджрд┐рдд:
$ virtualenv -p python2.7 ve
$ ./ve/bin/python -c 'import site; print(getattr(site, "getsitepackages"))'
Traceback (most recent call last):
File "<string>", line 1, in <module>
AttributeError: 'module' object has no attribute 'getsitepackages'
рд╡реЗрдирд╡ рдХреЗ рдмрд╛рд╣рд░ рджреМрдбрд╝рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ -
```
$ python -c 'import site; print(getattr(site, "getsitepackages"))'
<function getsitepackages at 0x104198410>
``````
$ ./ve/bin/python -c 'рдЖрдпрд╛рдд рд╕рд╛рдЗрдЯ; рдкреНрд░рд┐рдВрдЯ (рд╕рд╛рдЗрдЯред рдлрд╝рд╛рдЗрд▓ )'
/рдирд┐рдЬреА/tmp/ve/lib/python2.7/site.pyc
$ рдкрд╛рдпрдерди-рд╕реА 'рдЖрдпрд╛рдд рд╕рд╛рдЗрдЯ; рдкреНрд░рд┐рдВрдЯ (рд╕рд╛рдЗрдЯред рдлрд╝рд╛рдЗрд▓ )'/рд╕рд┐рд╕реНрдЯрдо/рд▓рд╛рдЗрдмреНрд░реЗрд░реА/рдлреНрд░реЗрдорд╡рд░реНрдХ/рдкрд╛рдпрдерди.рдлреНрд░реЗрдорд╡рд░реНрдХ/рд╕рдВрд╕реНрдХрд░рдг/2.7/lib/python2.7/site.pyc
We ship our own `./virtualenv_embedded/site.py`
рд╕рд╛рдЗрдЯ.py . рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ (рдФрд░ рдкрд╢реНрдЪрдЧрд╛рдореА рд░реВрдк рд╕реЗ рд╕рдВрдЧрдд рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рд░рд┐рд▓реАрдЬ рдЕрд╡рд░реЛрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛-рд╕рдВрдЧрдд рд╕рд╛рдЗрдЯ.py рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдпрд╣ рдХрдореА рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдРрд╕реА рд╣реА рд╣реИред
"рдпрд╣ рдХрдореА рдмрд░рд╕реЛрдВ рд╕реЗ рдРрд╕реА рд╣реА рд╣реИ"ред рдФрд░ рдирд░рдХ рд╣рд╛рдБ, рдпрд╣ рдЕрднреА рднреА рджрд░реНрдж рд╣реЛрддрд╛ рд╣реИ... :(
рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, thx
рдпрд╣ рдореБрдЭреЗ рдЖрдЬ рдмрд┐рдЯ; $#$ virtualenv
#$ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП site.py
рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╡рд╛рдХрдИ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреБрд░рд╛рдиреЗ 2.6 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ site.getusersitepackages()
рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рд╣реИрдВред
рдЗрд╕рдиреЗ рдореБрдЭреЗ рднреА рдХрд╛рдЯрд╛, рдФрд░ рдЗрд╕рдиреЗ рдореБрдЭреЗ рдЪреМрдХрдиреНрдирд╛ рдХрд░ рджрд┐рдпрд╛ред рдЕрдм рдореИрдВ рдпрд╣ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЕрдиреНрдп рдлрд╛рдЗрд▓реЗрдВ рд╕рд┐рд╕реНрдЯрдо рдкрд╛рдпрдерди рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖рдХрд░ --system-site-packages
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп) рдФрд░ рдЕрдиреНрдп "рдмрдЧ" рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рд╣реИрдВ ...
рдЕрднреА рднреА Python 2.7.6 рдХреЗ рд╕рд╛рде virtualenv 13.1.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдиреНрдп рд╣реИ, рдФрд░ рдпрд╣ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдХреБрдЫ рджреЗрд╡ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реИред
рдпрд╣рд╛рдБ рдХреБрдЫ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдлрд╝рд┐рдбрд▓рд┐рдВрдЧ рд╣реИ:
$ virtualenv --version
13.1.2
$ virtualenv test
New python executable in test/bin/python
Installing setuptools, pip, wheel...done.
$ source test/bin/activate
$ which python
/home/user/test/bin/python
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import site
>>> 'getsitepackages' in dir(site)
False
>>> site.getsitepackages()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'getsitepackages'
>>>
$ deactivate
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import site
>>> 'getsitepackages' in dir(site)
True
>>> site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
>>>
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╡рд╛рд╣... рдореИрдВрдиреЗ рдЕрднреА рдкрдврд╝рд╛: https://github.com/pypa/virtualenv/pull/697
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рдХреНрд╖рдг рдХреЗ рдмрдЬрд╛рдп рдореВрд▓ рдХрд╛рд░рдгреЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рд╣реИред рдкреБрдирд░реНрд▓реЗрдЦрди рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдкреБрдирд░реНрд▓реЗрдЦрди рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред
рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА:
рдореБрдЭреЗ рднреА рдмрд╕ рдЗрд╕реА рдиреЗ рдХрд╛рдЯ рд▓рд┐рдпрд╛ рд╣реИред
# Tried with and without --system-site-packages
[username@hostname] ~/dir $ virtualenv --system-site-packages venv
Using base prefix '/usr'
New python executable in venv/bin/python3.4
Also creating executable in venv/bin/python
Installing setuptools, pip, wheel...done.
[username@hostname] ~/dir $ venv/bin/python
Python 3.4.3 (default, Jul 28 2015, 18:20:59)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import site
>>> site.getsitepackages()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'getsitepackages'
>>>
$#$2 site.getsitepackages()
#$ . рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ site.py
рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ # 555 рд╕реЗ рдорд╛рд░реЗрдВ, рдЬреЛ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рднрд┐рдиреНрди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдмрд╣рд┐рд╖реНрдХрд░рдг рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдХрд╛рд░рдг -Werror рдХреЗ рд╕рд╛рде рдЪрд▓рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдЯреЙрдХреНрд╕ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреИрдХреЗрдЬ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ред
+1 рдЙрджрд╛рд╕_рдкрд╛рдВрдбрд╛ рдФрд░ рдвреЗрд░ рд╕рд╛рд░реЗ рдЖрдБрд╕реВ
рдЗрд╕реЗ рдЖрдЬ рдореБрдЭреЗ +1 рдХрд░реЗрдВ, рдХреЛрдб рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡ рдХреЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдВрджрд░ рдирд╣реАрдВред
+1 рдХрд╛рдЯрдиреЗ, рдХреНрдпрд╛ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ? рдзрдиреНрдпрд╡рд╛рджред
+1 рдЖрд░рдХреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдореБрджреНрджрд╛ (рдЬреНрдпреВрдкрд┐рдЯрд░ рдХреЗ рд▓рд┐рдП рд░рд┐рдореЛрдЯ рдХрд░реНрдиреЗрд▓)ред
+1 рдХрд╛рдЯрдиреЗ, рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡ рдХреЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдВрджрд░ рдирд╣реАрдВред
рд╕рдм, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ site.py
(рдпрд╛ рдЗрд╕рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ) рдХрд╛ рд╡рд┐рдХреНрд░реЗрддрд╛ рд╣реЛрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ: python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
рдореЗрд░реА рдкрд╛рдпрдерди рд╕рд╛рдЗрдЯ-рдкреИрдХреЗрдЬ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рд╕реНрдерд╛рди рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ
+1
+1 рдХрд╛рдЯрдиреЗ, рдХреНрдпрд╛ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ? рдзрдиреНрдпрд╡рд╛рджред
рдореИрдВ Ubuntu 16.04 64bit рдкрд░ virtualenv 15.0.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ
+1 рдХрд╛рдЯрдиреЗ
(рд╡рд░реНрдЪреБрдЕрд▓рдПрдирд╡реА 15.1.0 CentOS 7.5.1804 рдкрд░)
py3 рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдореИрдВрдиреЗ virtualenv
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЕрдЬрдЧрд░ рдХреЗ рдЕрдкрдиреЗ venv
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЕрдЬрдЧрд░ 3.6+ рдХреЗ рд╕рд╛рде, рдиреНрдпреВрдирддрдо venv
рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рд╕рд┐рдореНрд▓рд┐рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
$ python3.6 -m venv --without-pip grut
$ tree grut/
grut/
тФЬтФАтФА bin
тФВ┬а┬а тФЬтФАтФА activate
тФВ┬а┬а тФЬтФАтФА activate.csh
тФВ┬а┬а тФЬтФАтФА activate.fish
тФВ┬а┬а тФЬтФАтФА python -> python3.6
тФВ┬а┬а тФЬтФАтФА python3 -> python3.6
тФВ┬а┬а тФФтФАтФА python3.6 -> /usr/bin/python3.6
тФЬтФАтФА include
тФЬтФАтФА lib
тФВ┬а┬а тФФтФАтФА python3.6
тФВ┬а┬а тФФтФАтФА site-packages
тФЬтФАтФА lib64 -> lib
тФФтФАтФА pyvenv.cfg
6 directories, 7 files
рддреЛ, рдЕрдм рдФрд░ рдирд╣реАрдВ virtualenv
рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рднреА рдкреНрд░рд╢реНрдиред рдПрдЪрдЯреАрдПрдЪ рдЕрдиреНрдп рд▓реЛрдЧред
@RemiCardona рдореИрдВ рдЬрд┐рддрдирд╛ рд╣реЛ рд╕рдХреЗ рдкрд╛рдЗрдерди 3 рдХреЗ venv
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ tox
рдЕрднреА рднреА virtualenv
(рдкрд╛рдпрдерди 3 рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рднреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реВрдВ рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдпрд╛ рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tox
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдЦреБрд▓рд╛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдмрд╕ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ:
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
рдореЗрд░реА рдкрд╛рдпрдерди рд╕рд╛рдЗрдЯ-рдкреИрдХреЗрдЬ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рд╕реНрдерд╛рди рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ