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

#!/usr/bin/env python 

or

#!/usr/local/bin/python

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

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


当前回答

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

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

其他回答

使用第一个

which python

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

这个输出可以是任意的

/usr/bin/python

or

/bin/python

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

我们可以用:

#!/usr/bin/env

or

#!/bin/env

如果您安装了不同的模块,需要使用特定的 安装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版本,并且脚本需要在特定版本下运行,she-bang可以确保在直接执行脚本时使用正确的版本,例如:

#!/usr/bin/python2.7

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

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

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

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

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

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

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

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

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

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