我在Python文件的顶部看到了这些:
#!/usr/bin/env python
#!/usr/bin/env python3
在我看来,没有这一行,文件运行是一样的。
我在Python文件的顶部看到了这些:
#!/usr/bin/env python
#!/usr/bin/env python3
在我看来,没有这一行,文件运行是一样的。
当前回答
扩展一下其他的答案,这里有一个小例子,说明你的命令行脚本会因为不小心使用/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安装和不同的模块,这很方便 在每一个愿望中选择。如。
#!/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())
技术上讲,在Python中,这只是一个注释行。
这一行只在从shell(从命令行)运行py脚本时使用。这就是所谓的“Shebang!”,它被用于各种情况,而不仅仅是Python脚本。
在这里,它指示shell启动特定版本的Python(以处理文件的其余部分)。
它只是指定要使用的解释器。为了理解这一点,通过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支持打印操作符。现在,您已经了解了如何在脚本解释器之间切换。
这是一个shell约定,告诉shell哪个程序可以执行脚本。
#!/usr/bin/env 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")