为什么“#!/usr/bin/env python”比“#!/usr/bin/python”更正确?

72

有人知道这个吗?我从来没有找到答案。


4
不算很多。我正在使用OSX系统,但这里的env命令手册描述比较模糊。 - Kenneth Reitz
16
你最近有没有阅读过它?在我的 Debian 系统中,它是我见过的最无用的 man 手册之一,这可不是说笑。(这是全部的“描述”:将每个 NAME 设置为 VALUE 并在环境中运行 COMMAND。是的,这会让他完全懂了。) - Telemachus
4
env 的一个问题是无法添加“-u”或任何其他选项以传递给 Python 可执行文件。 - Arkady
有趣的一点。幸运的是,这对于shebang通常不是必需的。 - Kenneth Reitz
1
这里也有一个非常相关的 Unix SE 问题的很好的答案 这里 - Albert
显示剩余2条评论
5个回答

67

如果你喜欢在 PATH(Unix shell 中的 $PATH,Windows shell 中的 %PATH%)的各种有趣位置安装 Python,那么使用 /usr/bin/env 可以适应你的喜好(在类 Unix 环境中至少如此),而直接使用 /usr/bin/python 则不行。但是失去对脚本运行的 Python 版本控制并不划算……如果你看我的代码,更可能会看到它以 #!/usr/local/bin/python2.5 开头,而不是开放且可接受的 #!/usr/bin/env python——假设该脚本很重要,我想确保它使用我测试和开发时使用的特定版本,而不是一个半随机的版本;-)。


40
当然,你总是可以使用 #!/usr/bin/env python2.5 来限制半随机选择的集合 :=) - Ned Deily
1
+1 很好的解释,谢谢!我以前没有遇到过 "env" 的这种用法...现在我有了可以添加到我的脚本技巧库中的东西了。 - Jim Lewis
3
+1 用于不使用 "env python" 的理由。这让我认识到,如果我想要使用 "env python",那么我最好编写适用于最低公共版本的代码,因为我无法控制用户在PATH中首先安装的Python版本。 - glenn jackman
15
由于几个原因,-1 意味着:/usr/local/bin 对于 Python 不是标准的路径,只适用于 本地编译安装;在 shebang 中强制指定较小版本是一个坏主意:它可能保护你的脚本免受 2.4 的侵害,但也意味着你的脚本与 2.6 或 2.7 不兼容。对于较小版本的限制应该由 distutils/setup.py、软件包管理系统或条件导入来完成,而不是由 shebang 完成;而且,正如 @Ned 所说,你不应该硬编码路径或防止用户在 ~/bin 中使用他的 Python 2.5,如果系统没有提供这个路径,那就更糟了。因此,这种方法未来的可靠性很差,可移植性很差。 - MestreLion
3
还要注意的是,使用 #!/usr/bin/env python 和虚拟环境将在当前虚拟环境中执行脚本!这可能是好事,也可能不是,取决于您的使用情况。 - Pax0r
#!/usr/bin/env python3 对于使用python3的人来说,这将是一个不错的折中方案。也就是说,它足够具体但又不会过于具体。这是我的个人意见。 - Will

24

摘自维基百科

Shebangs指定系统可执行文件的绝对路径;这可能会在具有非标准文件系统布局的系统上引起问题。

通常,可以使用程序/usr/bin/env来规避此限制。


10

它会在您的环境中查找Python可执行文件并使用它。更具可移植性,因为Python可能不总是在/usr/bin/python中。env始终位于/usr/bin中。


环境并不总是存在,但我们正在增加脚本在更多机器上找到Python的概率。 :) - Will

5
它可以在 /usr/local/bin、~/bin、/opt/bin 等任何地方找到“python”。

谢谢!实际上这给我带来了问题,因为由于某种原因,env不存在。 - Kenneth Reitz
3
有点误导人。它只会在当前 $PATH 中找到第一个 "python",而且 OS X 上的 Python 实例可能非常难以寻找。特别是来自 python.org 和其他标准框架构建具有 framework 内的“bin”子目录,其中存储了“python”和其他可执行文件和脚本。很容易出现多个实例,这些实例可能或可能没有符号链接到通常的位置(如 /usr/local/bin)。在这种情况下,在 OS X 上管理 $PATH 并不像在没有框架式构建的系统上那么简单。 - Ned Deily
2
@KennethReitz:如果 /usr/bin/env 不存在,那么你的系统就是有问题的。env 是 POSIX 标准所必需的工具。 - MestreLion
@MestreLion,运行Python并不需要遵循POSIX。 - dadinck
@KennethReitz:没错,但 shebang 只在 POSIX 环境中使用。Windows(和 Python)会忽略它们,所以我假设你在 *nix 环境下,否则你的原始问题就没有意义了。 - MestreLion


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