以root身份运行python时,我发现了一个奇怪的行为。
当我在环境中将VIRTUAL_ENV
设置为任何值时,python3.6在python-path中包括site-packages目录。如果在当前环境中未设置该变量,则省略路径:
▲ ~ @ deepthought su -
Password:
root@deepthought:~# python3 -c "import sys;print(sys.path)"
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']
root@deepthought:~# export VIRTUAL_ENV=
root@deepthought:~# python3 -c "import sys;print(sys.path)"
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']
在site package documentation和Debian Python Policy中,都找不到对此行为的任何解释。尝试从systemd运行通过pip安装的python软件包时,这会导致某些不良行为,据我所知,它们都没有提到虚拟环境。
我的一位同事怀疑默认情况下root用户不包括site-packages文件夹,以避免下载的软件包的安全问题,但是,将VIRTUAL_ENV设置为任何(甚至是空)值的“ FIX”似乎很奇怪。
当然,您也可以将路径显式添加到PYTHON_PATH变量中,以暗示您“知道您在做什么以及它可能带来的影响”,但这根本不是我在su之后运行命令行时所期望的是从设置了VIRTUAL_ENV的用户那里导入的,因此将其导入到新环境中,所以我很想知道为什么在设置此ENV变量时会导入它。
P.S .: 我在python2.7下无法观察到相同的行为,也无法测试任何其他次要python3版本。