sudo python运行旧的Python版本

7 投票
4 回答
14302 浏览
提问于 2025-04-17 19:16

我在CentOS 6上安装了python 2.7.3,按照这些步骤进行的:

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

我在root用户和我的用户的bash_profile中都添加了别名,这样可以使用新的python。现在,当我在命令行输入python时,两个用户都能正确运行python2.7.3。

但是,如果我输入sudo python,它还是会运行旧版本的python2.6.6。

这可能是什么问题呢?

4 个回答

0

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

-i [命令]

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

0

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

你可以选择使用 sudo -E

-E 这个 -E(保留环境)选项会覆盖 sudoers(5) 中的 env_reset 选项。只有当匹配的命令有 SETENV 标签或者在 sudoers(5) 中设置了 setenv 选项时,这个选项才可用。

... 或者你可以直接指定你要执行的程序的完整路径,比如 sudo `which python`

(看起来你是按照文档使用了 alias。这种方法也能处理这个问题。)

16

sudo这个命令并不是通过你的命令行来运行其他命令,而是直接执行你指定的命令。这就意味着,(a) 没有人会去读取root用户的bash_profile文件,所以你在里面写的东西根本没用,(b) 即使你设置了命令别名,使用的时候也不会起作用。

所以,如果你想用alias来指定一个不同的Python版本,而不是系统默认的那个,你就不能用sudo python来运行你想要的那个版本。

最简单、也可能是最安全的解决办法就是直接指定路径:运行sudo /path/to/other/python。如果你经常需要这样做,可以为这个命令创建一个别名。

如果你真的想要,sudo是可以使用命令行的。你可以明确地生成一个bash命令行来运行python,或者更简单地使用-s-i选项。(在这种情况下,如果你想让root用户的~/.bash_profile文件运行,-s是没用的,但-i会有效。)不过,用sudo来启动命令行并不如用它来启动程序安全。你的sudoers文件甚至可能被设置成不允许你这样做。(如果你想,可以用visudo来修改,但在不完全理解的情况下打开安全漏洞通常被认为是个坏主意。)

撰写回答