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

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

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


当前回答

如果你在虚拟环境(比如venv)中运行脚本,那么在venv上执行哪个python将显示python解释器的路径:

~ / env / venv / bin / python

请注意,虚拟环境的名称嵌入在Python解释器的路径中。因此,在脚本中硬编码这个路径会导致两个问题:

如果将脚本上传到存储库,则会强制其他用户使用相同的虚拟环境名称。前提是他们首先发现了问题。 即使在其他虚拟环境中有所有必需的包,也不能跨多个虚拟环境运行脚本。

因此,为乔纳森的回答补充一点,理想的shebang是#!/usr/bin/env python,不仅可以跨操作系统的可移植性,还可以跨虚拟环境的可移植性!

其他回答

考虑到python2和python3之间的可移植性问题,您应该始终指定其中一个版本,除非您的程序与两个版本都兼容。

一些发行版现在已经发布了python符号链接到python3 -不要依赖于python是python2。

PEP 394强调了这一点:

为了容忍不同平台的差异,所有的新代码 需要调用Python解释器时不应该指定Python,但是 而是应该指定python2或python3(或更具体的 python2。X和python3。x版本;参见迁移说明)。这 当从shell调用时,应该在shebangs中进行区分 脚本,当通过system()调用调用时,或在任何 其他上下文。

这样做的主要原因是使脚本可跨操作系统环境移植。

例如,在mingw下,python脚本使用:

#!/c/python3k/python 

在GNU/Linux发行版下,它是:

#!/usr/local/bin/python 

or

#!/usr/bin/python

在最好的商业Unix sw/hw系统(OS/X)下,它是:

#!/Applications/MacPython 2.5/python

或在FreeBSD上:

#!/usr/local/bin/python

然而,所有这些差异可以通过使用以下方法使脚本可移植:

#!/usr/bin/env python

执行python文件时,可以使用./file.py,其中file是文件的名称。/usr/bin/env是PATH,然后python是python2, python3是python3(胡说)

#!/usr/bin/env python也可以允许python文件被其他程序执行,只要使用chmod +x file.py即可。

您可以使用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 python