我在Python文件的顶部看到了这些:
#!/usr/bin/env python
#!/usr/bin/env python3
在我看来,没有这一行,文件运行是一样的。
我在Python文件的顶部看到了这些:
#!/usr/bin/env python
#!/usr/bin/env python3
在我看来,没有这一行,文件运行是一样的。
当前回答
如果你在虚拟环境(比如venv)中运行脚本,那么在venv上执行哪个python将显示python解释器的路径:
~ / env / venv / bin / python
请注意,虚拟环境的名称嵌入在Python解释器的路径中。因此,在脚本中硬编码这个路径会导致两个问题:
如果将脚本上传到存储库,则会强制其他用户使用相同的虚拟环境名称。前提是他们首先发现了问题。 即使在其他虚拟环境中有所有必需的包,也不能跨多个虚拟环境运行脚本。
因此,为乔纳森的回答补充一点,理想的shebang是#!/usr/bin/env python,不仅可以跨操作系统的可移植性,还可以跨虚拟环境的可移植性!
其他回答
在我看来,没有这一行,文件运行是一样的。
如果是这样,那么也许你是在Windows上运行Python程序?Windows不使用这一行——相反,它使用file-name扩展名来运行与文件扩展名相关的程序。
然而,在2011年,一个“Python启动器”被开发出来,它(在某种程度上)在Windows上模仿了Linux的这种行为。这仅限于选择运行哪个Python解释器——例如,在安装了Python 2和Python 3的系统中选择Python 2和Python 3。在Python安装时,启动器可选地作为py.exe安装,并且可以与.py文件相关联,以便启动器将检查这一行,然后启动指定的Python解释器版本。
考虑到python2和python3之间的可移植性问题,您应该始终指定其中一个版本,除非您的程序与两个版本都兼容。
一些发行版现在已经发布了python符号链接到python3 -不要依赖于python是python2。
PEP 394强调了这一点:
为了容忍不同平台的差异,所有的新代码 需要调用Python解释器时不应该指定Python,但是 而是应该指定python2或python3(或更具体的 python2。X和python3。x版本;参见迁移说明)。这 当从shell调用时,应该在shebangs中进行区分 脚本,当通过system()调用调用时,或在任何 其他上下文。
您可以使用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
这被称为shebang线。维基百科词条解释道:
在计算中,shebang(也称为hashbang、hashpling、pound bang或crunchbang)指的是字符“#!”,当它们是解释器指令中作为文本文件第一行的前两个字符时。在类unix操作系统中,程序加载器将出现这两个字符作为文件是脚本的指示,并尝试使用文件中第一行剩余部分指定的解释器执行该脚本。
请参见Unix FAQ条目。
即使在Windows上,shebang行不决定要运行的解释器,您也可以通过在shebang行上指定选项来将选项传递给解释器。我发现在一次性脚本中保留一个通用的shebang行很有用(比如我在回答SO问题时写的脚本),这样我就可以在Windows和ArchLinux上快速测试它们。
env实用程序允许你在路径上调用命令:
剩下的第一个参数指定要调用的程序名称;它根据PATH环境变量进行搜索。其余的参数将作为参数传递给该程序。
它允许你选择你想要使用的可执行文件;这是非常 如果你有多个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())