为什么有些 python 脚本以 #!/usr/bin/env python 开头?

为什么有些 python 脚本以 #!/usr/bin/env python 开头?

我注意到一些 Python 脚本以

#!/usr/bin/env python

代替

#!/usr/bin/python

只有 Python 脚本使用 吗?是否有脚本以或#!/usr/bin/env开头?如果没有,那么为什么 Python 脚本不同?#!/usr/bin/env bash#!/usr/bin/env perl

答案1

在脚本的 shebang 中使用 env

在这一点上,Python 脚本与任何其他语言的脚本没有什么区别。

如果#!/usr/bin/env python脚本#!/usr/bin/python可执行文件,并在没有前面的语言的情况下调用。然后,脚本调用语言的解释器来运行脚本内的代码,而 shebang 就是在您的示例中查找的“指南” python

使用#!/usr/bin/env python而不是绝对路径(完整路径)#!/usr/bin/python可以确保找到 python(或任何其他语言的解释器),以防它在不同的 Linux 或类 Unix 发行版中可能不位于完全相同的位置,如下所述这里

虽然#!/usr/bin/python可以在默认的 Ubuntu 系统上运行,但最好使用它 #!/usr/bin/env python

关于 env

env是可执行文件/usr/bin或者正如@hvd 所述(感谢提示!),在几乎所有的 Linux 发行版中,都可以作为/usr/bin中的兼容符号链接使用。env

维基百科


env 是 Unix 和类 Unix 操作系统的 shell 命令。它用于打印环境变量列表或在更改的环境中运行另一个实用程序,而无需修改当前存在的环境。使用 env,可以添加或删除变量,也可以通过为现有变量分配新值来更改它们。

关于你的问题:

在实践中,env 还有另一种常见用途。它通常被 shell 脚本用来启动正确的解释器。在这种用法中,环境通常不会改变


更多详情env请见这里,并且像往常一样,在man env(从终端)。


关于shebang的附加信息;为什么#!python 不起作用?

在评论中,有人问为什么我们不能简单地将其用作#!pythonshebang。由于解释器位于中$PATH,因此这个想法是可以理解的。

原因是可执行文件是由执行的execve,我们可以读到这里. 具体来说:

解释器脚本是一个启用了执行权限的文本文件,其第一行格式如下:

#! interpreter [optional-arg]

翻译人员必须是 有效路径名 对于可执行文件....

解释execve器要求提供完整(有效)路径。这很有意义,因为脚本(任何语言)都可以在启动期间的任何时刻运行,甚至可能在$PATH设置之前运行。

答案2

Jacob 的回答解释得很好。不过我还想提一点。

在 Python 中使用/usr/bin/env/还有另一个目的。因为 Python 支持虚拟环境,使用/usr/bin/env python将确保您的脚本在虚拟环境中运行(如果您在虚拟环境中)。而/usr/bin/python将在虚拟环境之外运行。

答案3

除了上面给出的答案之外,使用/usr/bin/env允许将 Python 安装在非标准位置,只要PATH正确设置,脚本就可以在任何具有 的 UNIX 样式系统上不加修改地运行/usr/bin/env。这包括任何现代版本的 Linux 和 OS/X。

相关内容