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

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

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


当前回答

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

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

请参见Unix FAQ条目。

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

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

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

其他回答

强调一件大多数人都忽略了的事情可能是有道理的,这可能会妨碍立即理解。在终端中输入python时,通常不会提供完整路径。相反,可执行文件在PATH环境变量中查找。反过来,当你想直接执行Python程序/path/to/app.py时,必须告诉shell要使用哪个解释器(通过hashbang,其他贡献者在上面解释的内容)。

Hashbang期望到解释器的完整路径。因此,要直接运行你的Python程序,你必须提供Python二进制文件的完整路径,这差异很大,特别是考虑到使用virtualenv。为了解决可移植性,使用了/usr/bin/env的技巧。后者最初的目的是就地改变环境并在其中运行命令。当没有提供任何更改时,它将在当前环境中运行该命令,这将有效地导致相同的PATH查找。

源代码来自unix stackexchange

如果安装了多个版本的Python, /usr/bin/env将确保使用的解释器是环境$PATH中的第一个解释器。另一种方法是硬编码类似#!/usr/bin/python;这是可以的,但是不太灵活。

在Unix中,要解释的可执行文件可以通过#!在第一行的开头,后面跟着解释器(以及它可能需要的任何标志)。

如果您谈论的是其他平台,当然,这条规则不适用(但“shebang行”没有害处,如果您将该脚本复制到基于Unix的平台,如Linux、Mac等,则会有所帮助)。

也许你的问题是这样的:

如果你想使用:$python myscript.py

你根本不需要那句台词。系统将调用python,然后python解释器将运行您的脚本。

但如果你打算使用:$./myscript.py

像普通程序或bash脚本一样直接调用它,您需要编写这一行来指定系统使用哪个程序来运行它(并使其可执行chmod 755)

为了运行python脚本,我们需要告诉shell三件事:

该文件是一个脚本 我们希望哪个解释器执行脚本 所述解释器的路径

shebang #!完成(1)。shebang以#开头,因为#字符在许多脚本语言中是注释标记。因此,解释器会自动忽略shebang行的内容。

env命令完成(2.)和(3.)。引用“引力”,

env命令的一个常见用法是通过使 使用事实,env将搜索$PATH为它被告知的命令 推出。由于shebang线需要一个绝对路径 指定的,并且由于各种解释器(perl、bash、 Python)可能会有很大的变化,通常使用: #!/usr/bin/env perl,而不是试图猜测是否是 /usr/bin/perl, /usr/local/bin/perl, /usr/local/pkg/perl, /fileserver/usr/bin/perl,或者用户的/home/ mrdaniel /usr/bin/perl 系统…… 另一方面,env几乎总是在/usr/bin/env.中(除了 当它不是的时候;有些系统可能会使用/bin/env,但那是一个 相当罕见的情况,只发生在非linux系统上。)

技术上讲,在Python中,这只是一个注释行。

这一行只在从shell(从命令行)运行py脚本时使用。这就是所谓的“Shebang!”,它被用于各种情况,而不仅仅是Python脚本。

在这里,它指示shell启动特定版本的Python(以处理文件的其余部分)。