我在Python文件的顶部看到了这些:
#!/usr/bin/env python
#!/usr/bin/env python3
在我看来,没有这一行,文件运行是一样的。
我在Python文件的顶部看到了这些:
#!/usr/bin/env python
#!/usr/bin/env python3
在我看来,没有这一行,文件运行是一样的。
当前回答
在我看来,没有这一行,文件运行是一样的。
如果是这样,那么也许你是在Windows上运行Python程序?Windows不使用这一行——相反,它使用file-name扩展名来运行与文件扩展名相关的程序。
然而,在2011年,一个“Python启动器”被开发出来,它(在某种程度上)在Windows上模仿了Linux的这种行为。这仅限于选择运行哪个Python解释器——例如,在安装了Python 2和Python 3的系统中选择Python 2和Python 3。在Python安装时,启动器可选地作为py.exe安装,并且可以与.py文件相关联,以便启动器将检查这一行,然后启动指定的Python解释器版本。
其他回答
这被称为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
您可以使用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
如果安装了多个版本的Python, /usr/bin/env将确保使用的解释器是环境$PATH中的第一个解释器。另一种方法是硬编码类似#!/usr/bin/python;这是可以的,但是不太灵活。
在Unix中,要解释的可执行文件可以通过#!在第一行的开头,后面跟着解释器(以及它可能需要的任何标志)。
如果您谈论的是其他平台,当然,这条规则不适用(但“shebang行”没有害处,如果您将该脚本复制到基于Unix的平台,如Linux、Mac等,则会有所帮助)。
在我看来,没有这一行,文件运行是一样的。
如果是这样,那么也许你是在Windows上运行Python程序?Windows不使用这一行——相反,它使用file-name扩展名来运行与文件扩展名相关的程序。
然而,在2011年,一个“Python启动器”被开发出来,它(在某种程度上)在Windows上模仿了Linux的这种行为。这仅限于选择运行哪个Python解释器——例如,在安装了Python 2和Python 3的系统中选择Python 2和Python 3。在Python安装时,启动器可选地作为py.exe安装,并且可以与.py文件相关联,以便启动器将检查这一行,然后启动指定的Python解释器版本。