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

答案:

如果您安装了多个版本的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行上指定它们来将选项传递给解释器。我发现在一次性脚本中保留一个通用的shebang系列很有用(例如我在回答问题时写的那些),所以我可以在Windows和ArchLinux上快速测试它们。

ENV工具可以让你的道路上调用命令:

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

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

$ /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")

添加评论

友情链接:蝴蝶教程