如果您安装了多个版本的 Python, /usr/bin/env
将确保使用的解释器是您环境的$PATH
的第一个。另一种方法是硬编码#!/usr/bin/python
; 没关系,但不太灵活。
在 Unix 中,一个可以解释的可执行文件可以通过#!
来指示要使用的解释器#!
在第一行的开头,然后是解释器(以及它可能需要的任何标志)。
当然,如果您正在谈论其他平台,那么这条规则并不适用(但 “shebang line” 没有任何损害,如果您将该脚本复制到具有 Unix 基础的平台,例如 Linux,Mac,将会有所帮助等)。
在计算中,一个 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")