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

在我看来,这些文件在没有该行的情况下运行相同。


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

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

如果你在谈论其他平台,当然这个规则不适用(但是“shebang line”不会造成任何损害,并且如果你将这个脚本复制到一个具有Unix基础的平台上,比如Linux,Mac等)。


这被称为shebang线。 正如维基百科条目所解释的:

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

另请参阅Unix FAQ条目。

即使在Windows中,shebang行不确定要运行的解释器,也可以通过在shebang行中指定它们将选项传递给解释器。 我发现在一次性脚本中保留一个通用的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")
链接地址: http://www.djcxy.com/p/46397.html

上一篇: Why do people write the #!/usr/bin/env python shebang on the first line of a Python script?

下一篇: How do I use DomainContext.Load to populate properties of my ViewModel?