sudo:python:命令未找到

17

我想让sudo python找到Python 3。

我遇到了一个奇怪的问题,终端中输入python --version显示3.6,但输入sudo python --version却是2.7。尝试了一些方法后,最终用sudo apt-get purge python2*卸载了2.7版本。卸载成功了,但是我仍然不能让sudo python找到Python 3。

我尝试修改我的/root/.bashrc文件为:

export PATH="/home/username/anaconda3/bin:$PATH"

alias python="/home/username/anaconda3/bin/python"

我还把相同的行添加到了~/.bashrc文件中。

我的/etc/sudoers文件中有这一行:

Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"/usr/bin:$

我已经打开了新的终端甚至重启了电脑。有什么办法让 sudo python 直接找到 Python 3 吗?我不想使用单个会话的修复方法,而是希望每次使用终端时都可以解决。

谢谢。


2
sudo 不支持别名。这是因为别名是一个 shell 操作,但 sudo 不是 shell 的一部分(无法访问内部 shell 状态),而是直接调用操作系统的 execve() 调用来调用被调用软件。 - Charles Duffy
话虽如此-- sudo env PATH="$PATH" python 应该可以解决问题。 - Charles Duffy
我需要把它放在哪个文件里?还是每次会话都要输入? - Phlox Midas
每次运行 sudo python,但如果你总是这样做...嗯...那就有点问题了。(不一定是“代码异味”,但我们可以称其为“糟糕的实践异味”)。 - Charles Duffy
你知道一种持久的方法来修复它吗? - Phlox Midas
显示剩余3条评论
5个回答

27

你的 /etc/sudoers 文件被明确地配置为用已知的安全路径覆盖你的用户路径。

话虽如此,如果你想始终将用户的 PATH 环境变量传递给 sudo,你可以轻松地通过一个函数来覆盖它(安装在你的 ~/.bashrc 或类似位置以使其持久化):

psudo() { sudo env PATH="$PATH" "$@"; } 

接下来,伪 Python 将使用与 PATH 中相同的 Python 解释器。


如果您真的想覆盖 sudo 命令本身,也是可行的:

sudo() { command sudo env PATH="$PATH" "$@"; } 

command 内置命令可以防止函数进行递归调用(即调用自身)。


那个“伪”解决方案是一个很好的妥协。非常感谢你。 - Phlox Midas

12

如果您不想修改您的bashrc文件,您可以始终执行以下操作:sudo env "PATH=$PATH" python something


2

...其他方法。

当我看到这篇文章时,我只是想要运行以下命令:

python -m spylon_kernel install

但是当我运行上述命令时,我收到了一条消息,告诉我需要在我输入的命令后加上sudo,如下所示:

sudo python -m spylon_kernel install

然而,当我这样做时,控制台会显示“sudo: python: command not found”的错误信息。如果加上--user参数,如下所示:

python -m spylon_kernel install --user

就可以轻松解决问题。

请注意,最后一个命令中没有使用sudo命令。


1

被接受的答案建议设置函数来复制或替换sudo,语法对新Linux用户可能会很复杂。

有一种更简单的方法...

用户拥有miniconda3 python环境:

(base) user@machine:~/$ which python
/home/user/miniconda3/bin/python
(base) user@machine:~/$ python --version
Python 3.9.12

sudo 无法找到 Python:

(base) user@machine:~/$ sudo which python
(base) user@machine:~/$ sudo python --version
sudo: python: command not found

只需使用“which python”代替“python”即可!

(base) user@machine:~/$ sudo `which python` --version
Python 3.9.12

这样可以让shell解释器在sudo命令中将"python"替换为"/home/user/miniconda3/bin/python"。

或者,设置一个环境变量,比如说PY,始终使用它来代替python - 这样做的好处是可以在shell脚本中使用:

(base) user@machine:~/$ export PY=`which python`
(base) user@machine:~/$ $PY --version
Python 3.9.12
(base) user@machine:~/$ sudo $PY --version
Python 3.9.12

注意:使用带有--preserve-env=PATHsudo是很吸引人的,但并不起作用,因为sudo使用来自/etc/sudoerssecure_path来查找可执行文件,而不是$PATH。

-1
如果已经安装了Python 3.x,请尝试以下代码。
sudo python3 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接