ret*_*ikt 5 sudo environment-variables pipenv
我正在尝试以 root 身份运行 Pipenv python 实例。不以 root 身份运行时:
(myenv) $ python script.py
Run Code Online (Sandbox Code Playgroud)
正确使用了 Pipenv python。但是,当以 root 身份运行时sudo:
(myenv) $ sudo python script.py
Run Code Online (Sandbox Code Playgroud)
使用系统默认 python at/usr/bin/python代替。经过一番搜索,我找到了-Esudo 选项。然而,随着
(myenv) $ sudo -E python script.py
Run Code Online (Sandbox Code Playgroud)
它仍然使用/usr/bin/python,即使sudo -E echo $PATH给出与 相同echo $PATH,所以该-E选项工作正常;然而,sudo -E which python继续给/usr/bin/python!这不是权限或访问问题,因为 Pipenv python 的完整路径工作正常。为什么即使$PATH设置正确却使用了错误的二进制文件?
好吧,问题来了。当我进行故障排除时,我想找到 sudo 中 $PATH 的值。但是,使用 时sudo -E echo $PATH,我的用户(非 sudo)shell 会自动扩展它,所以 sudo 刚刚看到
echo /home/user/.local/share/virtualenvs/environment-_Sko9eTd/bin:/usr/bin/:......
Run Code Online (Sandbox Code Playgroud)
尝试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
Run Code Online (Sandbox Code Playgroud)
所以其实并sudo -E没有过去$PATH。要解决此问题,您可以在类似问题上查看此答案。本质上你只需添加
Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"
Run Code Online (Sandbox Code Playgroud)
到你的 sudoers 文件中visudo。