我在Python文件的顶部看到了这些:

#!/usr/bin/env python
#!/usr/bin/env python3

在我看来,没有这一行,文件运行是一样的。


当前回答

它只是指定要使用的解释器。为了理解这一点,通过touch test.py创建一个文件,然后在该文件中输入以下内容:

#!/usr/bin/env python3
print "test"

执行chmod +x test.py使脚本可执行。在此之后,当你执行./test.py时,你应该得到一个错误:

  File "./test.py", line 2
    print "test"
               ^
SyntaxError: Missing parentheses in call to 'print'

因为python3不支持打印操作符。

现在继续,将代码的第一行更改为:

#!/usr/bin/env python2

将test打印到stdout是可行的,因为python2支持打印操作符。现在,您已经了解了如何在脚本解释器之间切换。

其他回答

这被称为shebang线。维基百科词条解释道:

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

请参见Unix FAQ条目。

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

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

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

这是推荐的方法,在文档中提出:

2.2.2. 可执行Python脚本 在BSD的Unix系统上,可以直接编写Python脚本 可执行,就像shell脚本一样 # !/usr/bin/env python3.2

从http://docs.python.org/py3k/tutorial/interpreter.html executable-python-scripts

您可以使用virtualenv尝试解决这个问题

这里是test.py

#! /usr/bin/env python
import sys
print(sys.version)

创建虚拟环境

virtualenv test2.6 -p /usr/bin/python2.6
virtualenv test2.7 -p /usr/bin/python2.7

激活每个环境,然后检查差异

echo $PATH
./test.py

扩展一下其他的答案,这里有一个小例子,说明你的命令行脚本会因为不小心使用/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

json模块在Python 2.5中不存在。

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

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

如果你只需要区分Python 2。3. Python。x,最近发布的Python 3也提供了一个python3名称:

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

它告诉解释器,当你有多个版本的python时,使用哪个版本的python运行程序。