如果我在Ubuntu 16.04(Python2)上创建virtualenv,则会创建一个包含符号链接的目录local
:
===> virtualenv symlinktest
New python executable in /home/tguettler/tmp/symlinktest/bin/python
Please make sure you remove any previous custom paths from your /home/tguettler/.pydistutils.cfg file.
Installing setuptools, pip, wheel...done.
===> ls -l symlinktest/local/
===> ls -l symlinktest/local/*
lrwxrwxrwx 1 tguettler tguettler 35 Mär 7 14:21 symlinktest/local/bin -> /home/tguettler/tmp/symlinktest/bin
lrwxrwxrwx 1 tguettler tguettler 39 Mär 7 14:21 symlinktest/local/include -> /home/tguettler/tmp/symlinktest/include
lrwxrwxrwx 1 tguettler tguettler 35 Mär 7 14:21 symlinktest/local/lib -> /home/tguettler/tmp/symlinktest/lib
===> virtualenv --version
15.0.3
其他Linux发行版不会发生这种情况。
为什么以及在何处创建此符号链接?
在这个平台openSUSE 42.1 (x86_64)
上创建了一个从lib64到lib的符号链接......
我不明白这个符号链接的必要性。
答案 0 :(得分:1)
所以,在窥探virtualenv代码之后,似乎发生了以下情况:
create_environment
调用install_python
来调用fix_local_scheme
(https://github.com/pypa/virtualenv/blob/master/virtualenv.py#L1492)。
注意在docstring中他们如何声明这对于像Ubuntu和Python 2.7(你正在运行)这样的posix系统是必需的
>>> import platform
>>> platform.linux_distribution()
('Ubuntu', '16.04', 'xenial')
$ python2.7
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sysconfig
>>> sysconfig._get_default_scheme()
'posix_local'
$ cat /usr/lib/python2.7/sysconfig.py
def _get_default_scheme():
if os.name == 'posix':
# the default scheme for posix on Debian/Ubuntu is posix_local
# FIXME: return dist-packages/posix_prefix only for
# is_default_prefix and 'PYTHONUSERBASE' not in os.environ and 'real_prefix' not in sys.__dict__
# is_default_prefix = not prefix or os.path.normpath(prefix) in ('/usr', '/usr/local')
return 'posix_local'
return os.name
您还可以阅读不同前缀的说明:https://pymotw.com/2/sysconfig/#installation-paths,以获取更多信息。