sudo python 运行旧的python版本

Posted

技术标签:

【中文标题】sudo python 运行旧的python版本【英文标题】:sudo python runs old python version 【发布时间】:2013-03-04 16:49:12 【问题描述】:

我已经按照这些说明在 CentOS 6 上安装了 python 2.7.3

http://villaroad.com/2010/10/rolling-python-2-6-2-on-centos-5-3/

我已经为新 python 的 root 和 myuser 的 bash_profile 添加了别名。 现在,当我将 python 写入 shell 时,它可以从两个用户正确运行 python2.7.3。

但是,如果我写 sudo python 它仍然运行旧版本 python2.6.6

可能是什么问题?

【问题讨论】:

路径问题,见***.com/questions/257616/sudo-changes-path-why 不,不是。他“为新蟒蛇添加了别名……”。这意味着新的 python 最初不在 PATH 上。所以sudo 丢弃 PATH 并不重要。 【参考方案1】:

sudo 不使用你的 shell 来运行命令,它只是直接execs 命令。这意味着 (a) 没有任何东西来自 root 的 bash_profile,所以你放什么并不重要,并且 (b) 即使设置了 shell 别名也不重要。

因此,如果您想使用 aliases 指定与 PATH 中的 Python 不同的 Python,则不能使用 sudo python 来运行相同的 Python。

最简单,也可能是最安全的修复方法是明确的:运行sudo /path/to/other/python。如果您需要经常这样做,您可以随时为其创建别名。

如果你真的想要,可以sudo 使用外壳。显式生成运行pythonbash 命令行,或者(更简单地)只使用-s-i 标志。 (在这种情况下,如果你试图让 root 的 ~/.bash_profile 运行,-s 不会这样做,但 -i 会。)但是 sudoing shell 不如 sudoing 程序安全.您的sudoers 甚至可能被显式配置为阻止您这样做。 (如果需要,您可以使用 visudo 解决此问题,但在不确切了解您要打开的内容的情况下打开安全漏洞通常被认为是一件坏事。)

【讨论】:

sudo /path/to/other/python foo.py简单一点的是sudo `which python` foo.py @anthonybell:如果另一个 python 在您的 $PATH 上,这将起作用,但如果它是别名则不会,这就是 OP 所要求的。我想你可以使用 /usr/bin/which 而不是 bash 内置的;我相信 CentOS 6 附带的 GNU 工具版本有一个--read-aliases 标志或类似的东西,所以你可以做类似sudo $(alias | which --read-aliases python) 的东西。 (这只是我的想法;我目前没有可以测试的机器。)【参考方案2】:

我建议在调用脚本时使用sudo -i。直接来自man sudo:

-i [命令]

-i(模拟初始登录)选项将目标用户的 passwd(5) 条目中指定的 shell 作为登录 shell 运行。这意味着 shell 将读取特定于登录名的资源文件,例如 .profile 或 .login。如果指定了命令,则将其传递给 shell 以执行。否则,将执行交互式 shell。 sudo 在运行 shell 之前尝试更改到该用户的主目录。它还初始化环境,保持 DISPLAY 和 TERM 不变,设置 HOME 、 MAIL 、 SHELL 、 USER 、 LOGNAME 和 PATH ,以及 Linux 和 AIX 系统上 /etc/environment 的内容。所有其他环境变量都被删除。

【讨论】:

这显然需要您访问(在您的 sudoers 中)文件才能运行 shell。如果您已经拥有/需要该访问权限,那不是问题。但我不建议添加它只是为了更容易 sudo 特定的 Python 安装......【参考方案3】:

bin目录可能引用了旧版本的Python

> ls -la /usr/bin/python
lrwxrwxrwx 1 root root 9 Dec 21  2013 /usr/bin/python -> python2.7

将默认的python版本重定向到你想要的那个。

【讨论】:

【参考方案4】:

问题是您的$PATH 在执行时会发生变化。

您可以使用sudo -E:

-E -E(保留环境)选项将覆盖 sudoers(5) 中的 env_reset 选项。仅当匹配命令具有 SETENV 标记或 setenv 选项在 sudoers(5) 中设置。

... 或者您可以指定可执行文件的完整路径。 sudo `which python`.

(看起来你在文档中使用了alias。这个方法也可以处理这个问题。)

【讨论】:

问题是不是他的 PATH 在执行时改变了。查看问题的 cmets,或 F.J 删除的答案,或者只是阅读问题。而-E 对别名没有帮助;你需要 sudo 一个 shell 来获取 shell 别名(显式地,或者通过 -s-i)。 @abarnert 使用“sudo which python”确实可以处理它。

以上是关于sudo python 运行旧的python版本的主要内容,如果未能解决你的问题,请参考以下文章

Centos sudo命令执行python与普通用户执行python版本不同

防止软件包安装在旧的 Python 版本上

如何在CentOS6上安装Python2.7和Python3.3

《head first python》windows环境下,如何解决sudo不是内部命令问题。

mac配置python自然语言处理环境

我正在尝试在 python 中运行 sudo 来打开一个应用程序