为什么Python脚本第一行写“#!/usr/bin/env python”?
我在Python文件的顶部看到这些内容:
#!/usr/bin/env python
#!/usr/bin/env python3
我觉得这些文件在没有那行代码的情况下运行也没什么不同。
22 个回答
在这里,我想进一步解释一下其他回答的内容,给你一个小例子,说明如果不小心使用 /usr/bin/env
作为脚本的开头,可能会遇到麻烦:
$ /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 模块的。
为了避免这种问题,可以使用一些带版本号的 Python 命令名,这些命令通常在大多数 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")
这段内容提到的叫做 shebang 行。正如维基百科上解释的那样:
在计算机中,shebang(也叫 hashbang、hashpling、pound bang 或 crunchbang)指的是在文本文件的第一行中,作为解释器指令的前两个字符“#!”。在类 Unix 操作系统中,程序加载器会把这两个字符的存在视为文件是一个脚本的标志,并尝试使用文件第一行中其余部分指定的解释器来执行这个脚本。
你也可以查看 Unix 常见问题解答。
即使在 Windows 系统上,虽然 shebang 行并不决定要运行哪个解释器,但你仍然可以通过在 shebang 行上指定选项来传递给解释器。我觉得在一些临时脚本中保留一个通用的 shebang 行是很有用的(比如我在回答 Stack Overflow 问题时写的那些脚本),这样我可以快速在 Windows 和 Arch Linux 上测试它们。
env 工具可以让你在路径上调用一个命令:
第一个剩余的参数指定要调用的程序名;它会根据
PATH
环境变量进行搜索。任何剩下的参数都会作为参数传递给这个程序。
如果你电脑上安装了多个版本的Python,/usr/bin/env
可以确保使用的是你环境中$PATH
里第一个找到的解释器。另一种方法是直接写死,比如#!/usr/bin/python
; 这样也可以,但灵活性就差一些。
在Unix系统中,一个可执行文件如果需要被解释,可以在第一行的开头加上#!
,后面跟上解释器的路径(还有它可能需要的任何参数)。
如果你在谈论其他平台,这个规则就不适用了(不过这个“shebang行”也没坏处,如果你把这个脚本复制到一个基于Unix的平台,比如Linux、Mac等,它会很有帮助)。