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

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

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


当前回答

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

其他回答

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

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

如果是这样,那么也许你是在Windows上运行Python程序?Windows不使用这一行——相反,它使用file-name扩展名来运行与文件扩展名相关的程序。

然而,在2011年,一个“Python启动器”被开发出来,它(在某种程度上)在Windows上模仿了Linux的这种行为。这仅限于选择运行哪个Python解释器——例如,在安装了Python 2和Python 3的系统中选择Python 2和Python 3。在Python安装时,启动器可选地作为py.exe安装,并且可以与.py文件相关联,以便启动器将检查这一行,然后启动指定的Python解释器版本。

它允许你选择你想要使用的可执行文件;这是非常 如果你有多个python安装和不同的模块,这很方便 在每一个愿望中选择。如。

#!/bin/sh
#
# Choose the python we need. Explanation:
# a) '''\' translates to \ in shell, and starts a python multi-line string
# b) "" strings are treated as string concat by python, shell ignores them
# c) "true" command ignores its arguments
# c) exit before the ending ''' so the shell reads no further
# d) reset set docstrings to ignore the multiline comment code
#
"true" '''\'
PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    echo Using preferred python $ALTERNATIVE_PYTHON
    exec $PREFERRED_PYTHON "$0" "$@"
elif [ -x $ALTERNATIVE_PYTHON ]; then
    echo Using alternative python $ALTERNATIVE_PYTHON
    exec $ALTERNATIVE_PYTHON "$0" "$@"
else
    echo Using fallback python $FALLBACK_PYTHON
    exec python3 "$0" "$@"
fi
exit 127
'''

__doc__ = """What this file does"""
print(__doc__)
import platform
print(platform.python_version())

这是一个shell约定,告诉shell哪个程序可以执行脚本。

#!/usr/bin/env python

解析为Python二进制文件的路径。

这意味着更多的是历史信息而不是“真实的”答案。

请记住,过去有很多类似unix的操作系统,它们的设计者都有自己的想法,把东西放在哪里,有时根本不包括Python、Perl、Bash或许多其他GNU/开源的东西。

这甚至适用于不同的Linux发行版。在Linux - pre-FHS1 -你可能在/usr/bin/或/usr/local/bin/中有Python。或者它可能还没有安装,所以您构建了自己的,并将其放在~/bin中。

Solaris是我工作过的最糟糕的系统,部分原因是从Berkeley Unix到System v的过渡。你可能会在/usr/、/usr/local/、/usr/ucb/、/opt/等目录下找到东西。这可能会导致一些很长的路径。我记得从Sunfreeware.com安装每个包在自己的目录,但我不记得它是否符号链接二进制文件到/usr/bin/。

哦,有时/usr/bin/在NFS服务器2上。

所以env实用程序就是为了解决这个问题而开发的。

然后你可以写#!/bin/env解释器,只要路径是正确的,程序就有合理的运行机会。当然,合理意味着(对于Python和Perl)还设置了适当的环境变量。对于bash/ksh/zsh,它可以正常工作。

这很重要,因为人们在传递shell脚本(如Perl和Python),如果你在Red Hat Linux工作站上硬编码/usr/bin/python,它将在SGI上坏掉……不,我认为IRIX把Python放在了正确的位置。但在Sparc空间站上,它可能根本无法运行。

我想念我的斯巴达站。但不是很多。好吧,现在你让我在易趣网上搜了。Bastages。


1文件系统层次标准。

2是的,有时候人们还是会做这样的事情。不,我的腰带上既没有萝卜也没有洋葱。