我正在尝试以 root 身份运行 Pipenv python 实例。不以 root 身份运行时:
(myenv) $ python script.py
Pipenv python 已正确使用。但是,以 root 身份运行时sudo
:
(myenv) $ sudo python script.py
系统默认的 python at/usr/bin/python
被使用。经过一番搜索,我找到了-E
sudo 选项。但是,
(myenv) $ sudo -E python script.py
它仍然使用/usr/bin/python
,即使sudo -E echo $PATH
给出的结果与相同echo $PATH
,因此-E
选项工作正常;但是,sudo -E which python
继续给出/usr/bin/python
!这不是权限或访问问题,因为 Pipenv python 的完整路径工作正常。为什么即使$PATH
设置正确,也会使用错误的二进制文件?
答案1
好的,问题就出在这里。当我进行故障排除时,我想在 sudo 中找到 $PATH 的值。但是,使用 时sudo -E echo $PATH
,我的用户(非 sudo)shell 会自动扩展它,因此 sudo 只会看到
echo /home/user/.local/share/virtualenvs/environment-_Sko9eTd/bin:/usr/bin/:......
尝试sudo -E env
告诉我们真实的故事:
LANGUAGE=en_GB:en
# more environment variables ...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ^^ doesn't include my Pipenv path
所以实际上,sudo -E
没有通过$PATH
。要解决这个问题,您可以看到这个答案类似问题。本质上你只需添加
Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"
添加到您的 sudoers 文件visudo
。