我应该把shebang放在我的Python脚本中吗?以什么形式?

#!/usr/bin/env python 

or

#!/usr/local/bin/python

它们同样便携吗?哪种形式使用最多?

注意:龙卷风项目使用shebang。另一方面,Django项目没有。


这只是个人口味的问题。添加shebang意味着人们可以直接调用脚本(假设它被标记为可执行);省略它只意味着必须手动调用python。

运行程序的最终结果不会受到任何影响;这只是手段的选择。


shebang的目的是让脚本在希望从shell执行脚本时识别解释器类型。 大多数情况下,但并不总是这样,通过在外部提供解释器来执行脚本。 使用示例:python-x。x script.py

即使没有shebang声明器,这也可以工作。

为什么第一个更“可移植”是因为,/usr/bin/env包含你的PATH声明,它说明了你的系统可执行文件所在的所有目的地。

注意:Tornado没有严格使用shebang, Django也没有严格使用shebang。这取决于您如何执行应用程序的主要功能。

另外:它不会随Python而变化。


如果脚本是可执行的,则应该添加shebang。您还应该使用安装软件来安装脚本,该安装软件将shebang修改为正确的内容,以便它能够在目标平台上工作。distutils和Distribute就是这样的例子。


有时,如果答案不是很清楚(我的意思是你无法决定是或否),那么这并不太重要,你可以忽略这个问题,直到答案清楚为止。

# !唯一的目的是启动脚本。Django自己加载源代码并使用它们。它从不需要决定应该使用哪个解释器。这样,#!实际上在这里没有意义。

通常,如果它是一个模块,不能用作脚本,则不需要使用#!另一方面,模块源代码通常包含if __name__ == '__main__':…至少有一些琐碎的功能测试。然后#!这又说得通了。

使用#!当你同时使用Python 2和Python 3脚本时——它们必须由不同版本的Python解释。这样,你必须记住手动启动脚本时必须使用的python(没有#!内)。如果您混合使用了这些脚本,那么使用#!在内部,使它们可执行,并作为可执行文件启动它们(chmod…)。

使用MS-Windows时,#!这毫无意义——直到最近。Python 3.3引入了一个Windows Python启动器(py.exe和pyw.exe),它会读取#!行,检测已安装的Python版本,并使用正确的或明确需要的Python版本。由于扩展名可以与程序相关联,您可以在Windows中获得与基于unix的系统中的execute标志类似的行为。


如果你有多个Python版本,并且脚本需要在特定版本下运行,she-bang可以确保在直接执行脚本时使用正确的版本,例如:

#!/usr/bin/python2.7

注意,脚本仍然可以通过完整的Python命令行运行,或者通过导入运行,在这种情况下,she-bang将被忽略。但是对于直接运行的脚本,这是使用she-bang的一个很好的理由。

# !/usr/bin/env python通常是更好的方法,但在特殊情况下会有所帮助。

通常情况下,最好建立一个Python虚拟环境,在这种情况下,泛型#!/usr/bin/env python将为virtualenv识别正确的python实例。


任何脚本中的shebang行决定了脚本是否能够像独立可执行文件一样执行,而无需事先在终端中键入python或在文件管理器中双击它(在配置正确的情况下)。它不是必需的,但通常放在那里,这样当有人看到在编辑器中打开的文件时,他们立即知道他们在看什么。但是,你用哪条线是很重要的。

Python 3脚本(默认为版本3.latest)的正确用法是:

#!/usr/bin/env python3

Python 2脚本(默认为版本2.latest)的正确用法是:

#!/usr/bin/env python2

不应该使用以下代码(除非你编写的代码与Python 2兼容,这种情况很少见)。X和3.x):

#!/usr/bin/env python

PEP 394中给出这些建议的原因是,python可以在不同的系统上引用python2或python3。

此外,不要使用:

#!/usr/local/bin/python

python可以安装在/usr/bin/python或/bin/python 案例,以上#!将会失败。”

——“# !/usr/bin/env python“vs”!/ usr / local / bin / python)”


我应该把shebang放在我的Python脚本中吗?

在Python脚本中输入shebang表示:

该模块可以作为脚本运行 它是否只能在python2, python3上运行,或者它是否兼容Python 2/3 在POSIX上,如果你想直接运行脚本而不显式调用python可执行文件,这是必要的

它们同样便携吗?哪种形式使用最多?

如果你手动编写shebang,那么总是使用#!/usr/bin/env python,除非你有特定的原因不使用它。即使在Windows (Python启动器)上也能理解此表单。

注意:安装的脚本应该使用特定的python可执行文件,例如/usr/bin/python或/home/me/.virtualenvs/project/bin/python。如果你在shell中激活了virtualenv,那么某些工具会坏掉,这是很糟糕的。幸运的是,在大多数情况下,正确的shebang是由setuptools或您的分发包工具自动创建的(在Windows上,setuptools可以自动生成包装器.exe脚本)。

换句话说,如果脚本在源代码签出中,那么您可能会看到#!/usr/bin/env python。如果已经安装,则shebang是特定python可执行文件的路径,例如#!/usr/local/bin/python(注意:您不应该手动写入后一个类别的路径)。

要选择是否应该在shebang中使用python、python2或python3,请参阅PEP 394 -类unix系统上的“python”命令:

... Python只应该在shebang行中用于以下脚本 与Python 2和3兼容的源代码。 的默认版本的最终更改 Python, python2的脚本应该更新为源代码 兼容python3或者在shebang行中使用python2。


使用第一个

which python

这将给出输出作为python解释器(二进制)存在的位置。

这个输出可以是任意的

/usr/bin/python

or

/bin/python

现在适当地选择shebang线并使用它。

我们可以用:

#!/usr/bin/env

or

#!/bin/env

答:只有当您计划使它成为一个命令行可执行脚本时。

步骤如下:

首先验证要使用的正确的shebang字符串:

which python

从中获取输出并将其添加到第一行中(使用shebang #!)。

在我的系统上,它的反应如下:

$which python
/usr/bin/python

所以你的shebang看起来像这样:

#!/usr/bin/python

保存后,它仍然会像以前一样运行,因为python会将第一行视为注释。

python filename.py

为了使它成为一个命令,复制它以删除.py扩展名。

cp filename.py filename

告诉文件系统这将是可执行的:

chmod +x filename

要测试它,使用:

./filename

最好的做法是将它移动到你的$PATH中的某个地方,这样你只需要输入文件名本身。

sudo cp filename /usr/sbin

这样它就可以在任何地方工作(在文件名之前没有。/)


当我最近在Windows 7上安装Python 3.6.1时,它还安装了Windows的Python启动器,它应该处理shebang行。然而,我发现Python启动器没有这样做:shebang行被忽略,并且总是使用Python 2.7.13(除非我使用py -3执行脚本)。

为了解决这个问题,我必须编辑Windows注册表键HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\命令。这仍然有价值

"C:\Python27\python.exe" "%1" %*

从我之前的Python 2.7安装。我将这个注册表项值修改为

"C:\Windows\py.exe" "%1" %*

Python Launcher shebang行处理工作如上所述。


如果您安装了不同的模块,需要使用特定的 安装Python,那么shebang一开始似乎是有限的。然而, 您可以像下面这样使用一些技巧来允许调用shebang 首先作为shell脚本,然后选择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 $PREFERRED_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脚本之间重用:

#!/bin/bash
"true" '''\'; source $(cd $(dirname ${BASH_SOURCE[@]}) &>/dev/null && pwd)/select.sh; exec $CHOSEN_PYTHON "$0" "$@"; exit 127; '''

然后select。sh有:

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
    CHOSEN_PYTHON=$PREFERRED_PYTHON
elif [ -x $ALTERNATIVE_PYTHON ]; then
    CHOSEN_PYTHON=$ALTERNATIVE_PYTHON
else
    CHOSEN_PYTHON=$FALLBACK_PYTHON
fi

这实际上是一个关于Python解释器的路径应该是绝对路径还是逻辑路径(/usr/bin/env)的问题,考虑到可移植性。

在彻底测试该行为后,我的观点是she-bang中的逻辑路径是两个选项中更好的。

作为一名Linux工程师,我的目标始终是为我的开发人员客户提供最合适的、优化的主机,所以Python环境的问题是我真的需要一个可靠的答案。遇到其他关于这个问题的答案和其他Stack Overflow网站的答案都是泛泛地谈论这个问题,但没有支持证明,我在Unix.SE上对这个问题进行了一些非常细粒度的测试和分析。


如果你使用像pyenv这样的虚拟环境,最好写#!/usr/bin/env python pyenv设置将控制python的哪个版本以及从哪个文件位置开始运行脚本。

如果已知您的代码是特定于版本的,那么如果您在shebang中指定了预期的版本,那么它将帮助其他人发现为什么您的脚本在他们的环境中不能正常工作。


对于想要从命令行执行的文件,我建议使用

#! /usr/bin/env python3

否则你就不需要shebang了(当然这也没什么坏处)。


如果你想让你的文件可执行,你必须在你的脚本中添加shebang line。

#!/usr/bin/env python3 

这是更好的选择,因为这将不依赖于特定的Linux发行版,但可以用于几乎所有的Linux发行版,因为它从环境变量中寻找python3路径,这对于不同的Linux发行版是不同的。

#!/usr/local/bin/python3 

将是python3的发行版特定路径,如果python3不在此路径上,将无法工作,并且可能导致开发人员从一个发行版迁移到另一个linux发行版时的混乱和模糊。