使用sudo python运行旧版本的python。

7
我已经按照以下步骤在CentOS 6上安装了Python 2.7.3:http://villaroad.com/2010/10/rolling-python-2-6-2-on-centos-5-3/。我已经在root和myuser的bash_profile中添加了新Python的别名。现在,在shell中输入python,它可以从两个用户中正确运行Python 2.7.3。但是,如果我输入sudo python,它仍然会运行旧版本Python 2.6.6。可能出现了什么问题?请帮忙解答。

这是一个路径问题,请参见https://dev59.com/BXVC5IYBdhLWcg3wjx1d。 - Fredrik Pihl
不是这样的。他“为新的Python添加了别名”。这意味着新的Python首先不在PATH上。因此,即使“sudo”丢弃了PATH,也没有关系。 - abarnert
4个回答

16

sudo 命令不使用你的 shell 来运行命令,它直接 exec 执行指定的命令。这意味着 (a) 没有任何内容会 source root 的 bash_profile,因此无论你在那里放置什么都无关紧要,(b) 即使设置了 shell 别名,也不会起作用。

因此,如果您想使用别名来指定不同于 PATH 上的 Python 版本,则不能使用 sudo python 来运行它。

最简单、也可能是最安全的解决方法是明确指定路径:运行 sudo /path/to/other/python。如果您需要经常这样做,可以为此创建一个别名。

如果您真的想要,可以使 sudo 使用一个 shell。可以显式生成运行 pythonbash 命令行,也可以(更简单地)使用 -s-i 标志。(在这种情况下,如果您尝试运行 root 的 ~/.bash_profile-s 将无法实现,但 -i 可以。)但是,使用 sudo 运行 shell 不如使用 sudo 运行程序安全。如果您的 sudoers 已经明确配置为禁止该操作,甚至可能无法这样做。(如果您愿意,可以使用 visudo 修复它,但是在不完全理解正在开放的安全漏洞时打开一个安全漏洞通常被认为是一件坏事。)


相对于 sudo /path/to/other/python foo.py 来说,sudo \which python` foo.py` 要简单一些。 - anthonybell
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - abarnert

0

bin目录可能在引用旧版的Python。

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

重定向默认的Python版本到你想要的版本。

0

我建议在调用脚本时使用sudo -i。直接从man sudo中引用:

-i [command]

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


1
这显然需要您在sudoers文件中拥有访问权限才能运行shell。如果您已经拥有/需要该访问权限,那就没有问题。但我不建议仅为了更轻松地sudo特定的Python安装而添加它。 - abarnert

0

问题在于您的$PATH在执行时发生了变化。

您可以使用sudo -E

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

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

(看起来您根据文档使用了alias。这种方法也可以处理它。)


问题并不是他的PATH在执行时发生了变化。请查看问题下面的评论,或者F.J已删除的答案,或者直接阅读问题。而-E不能帮助别名;你需要使用sudo来获取shell别名(可以明确地使用-s-i,也可以隐式地使用)。 - abarnert
@abarnert 使用 "sudo which python" 可以处理它。 - Jeff Ferland

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