协慌网

登录 贡献 社区

为什么人们在 Python 脚本的第一行写#!/ usr / bin / env python shebang?

在我看来,如果没有该行,文件运行相同。

答案

如果您安装了多个版本的 Python, /usr/bin/env将确保使用的解释器是您环境的$PATH的第一个。另一种方法是硬编码#!/usr/bin/python ; 没关系,但不太灵活。

在 Unix 中,一个可以解释的可执行文件可以通过#!来指示要使用的解释器#!在第一行的开头,然后是解释器(以及它可能需要的任何标志)。

当然,如果您正在谈论其他平台,那么这条规则并不适用(但 “shebang line” 没有任何损害,如果您将该脚本复制到具有 Unix 基础的平台,例如 Linux,Mac,将会有所帮助等)。

这被称为shebang 线 。正如维基百科条目所述

在计算中,一个 shebang(也称为 hashbang,hashpling,pound bang 或 crunchbang)指的是字符 “#!” 当它们是解释器指令中的前两个字符作为文本文件的第一行时。在类 Unix 操作系统中,程序加载器将这两个字符作为文件是脚本的指示,并尝试使用文件中第一行其余部分指定的解释器来执行该脚本。

另请参阅Unix FAQ 条目

即使在 Windows 上,shebang 行也没有确定要运行的解释器,您可以通过在 shebang 行上指定它们来将选项传递给解释器。我发现在一次性脚本(例如我在回答 SO 上的问题时写的那些)中保留通用的 shebang 系列很有用,所以我可以在 Windows 和ArchLinux上快速测试它们。

env 实用程序允许您在路径上调用命令:

第一个剩下的参数指定要调用的程序名称; 根据PATH环境变量搜索它。任何剩余的参数都作为参数传递给该程序。

稍微扩展一下其他答案,这里有一个小例子,说明你的命令行脚本如何通过不谨慎地使用/usr/bin/env shebang 行来解决问题:

$ /usr/local/bin/python -V
Python 2.6.4
$ /usr/bin/python -V
Python 2.5.1
$ cat my_script.py 
#!/usr/bin/env python
import json
print "hello, json"
$ PATH=/usr/local/bin:/usr/bin
$ ./my_script.py 
hello, json
$ PATH=/usr/bin:/usr/local/bin
$ ./my_script.py 
Traceback (most recent call last):
  File "./my_script.py", line 2, in <module>
    import json
ImportError: No module named json

Python 2.5 中不存在 json 模块。

防止出现此类问题的一种方法是使用通常与大多数 Pythons 一起安装的版本化 python 命令名称:

$ cat my_script.py 
#!/usr/bin/env python2.6
import json
print "hello, json"

如果您只需要区分 Python 2.x 和 Python 3.x,Python 3 的最新版本也提供了python3名称:

$ cat my_script.py 
#!/usr/bin/env python3
import json
print("hello, json")