我应该把#!(shebang)在Python脚本中,它应该采取什么形式?

我应该把#!(shebang)在Python脚本中,它应该采取什么形式?,python,shell,python-3.x,shebang,Python,Shell,Python 3.x,Shebang,我应该在Python脚本中加入shebang吗?以什么形式 #/usr/bin/env python 或 #/usr/local/bin/python 这些是否同样便于携带?哪种形式最常用 注意:项目使用shebang。另一方面,这个项目没有。这实际上只是品味的问题。添加shebang意味着人们可以根据需要直接调用脚本(假设它被标记为可执行);省略它只意味着必须手动调用python 运行程序的最终结果不会受到任何影响;这只是手段的选择。这实际上只是品味的问题。添加shebang意味着人们可以

我应该在Python脚本中加入shebang吗?以什么形式

#/usr/bin/env python

#/usr/local/bin/python
这些是否同样便于携带?哪种形式最常用


注意:项目使用shebang。另一方面,这个项目没有。这实际上只是品味的问题。添加shebang意味着人们可以根据需要直接调用脚本(假设它被标记为可执行);省略它只意味着必须手动调用
python


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

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


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

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

即使您没有shebang声明器,这也会起作用

第一个更“可移植”的原因是,
/usr/bin/env
包含您的
路径
声明,该声明说明了系统可执行文件所在的所有目标

注意:Tornado不严格使用shebangs,Django也不严格使用。它随您执行应用程序主功能的方式而变化


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

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

即使您没有shebang声明器,这也会起作用

第一个更“可移植”的原因是,
/usr/bin/env
包含您的
路径
声明,该声明说明了系统可执行文件所在的所有目标

注意:Tornado不严格使用shebangs,Django也不严格使用。它随您执行应用程序主功能的方式而变化


另外:它不随Python而变化。

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

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

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

#唯一用途是启动脚本。Django自己加载源并使用它们。它永远不需要决定应该使用什么解释器。这样,
#在这里实际上毫无意义

通常,如果它是一个模块,不能用作脚本,则无需使用
#。另一方面,模块源代码通常包含
if uuuuu name_uuuu='\uuuuu main_uuu':…
,其中至少包含一些简单的功能测试。然后是
#再次有意义

使用
#的一个很好的理由——它们必须由不同版本的Python解释。这样,您必须记住手动启动脚本时必须使用的
python
(内部没有
#!
)。如果混合使用这些脚本,最好使用
#内部,使其可执行,并将其作为可执行文件(chmod…)启动


使用MS Windows时,
#才有意义。Python3.3引入了一个Windows Python启动器(py.exe和pyw.exe),用于读取
#行,检测已安装的Python版本,并使用正确或明确需要的Python版本。由于扩展可以与程序关联,因此在Windows中可以获得与基于Unix的系统中的execute flag类似的行为。

有时,如果答案不是很清楚(我的意思是您无法确定是还是否),那么这也不太重要,您可以忽略问题,直到答案清楚为止

#唯一用途是启动脚本。Django自己加载源并使用它们。它永远不需要决定应该使用什么解释器。这样,
#在这里实际上毫无意义

通常,如果它是一个模块,不能用作脚本,则无需使用
#。另一方面,模块源代码通常包含
if uuuuu name_uuuu='\uuuuu main_uuu':…
,其中至少包含一些简单的功能测试。然后是
#再次有意义

使用
#的一个很好的理由——它们必须由不同版本的Python解释。这样,您必须记住手动启动脚本时必须使用的
python
(内部没有
#!
)。如果混合使用这些脚本,最好使用
#内部,使其可执行,并将其作为可执行文件(chmod…)启动

使用MS Windows时,
#才有意义。Python 3.3引入了Windows Python启动器(py.exe和
which python
/usr/bin/python
/bin/python
#!/usr/bin/env
#!/bin/env
which python
$which python
/usr/bin/python
#!/usr/bin/python
python filename.py
cp filename.py filename
chmod +x filename
./filename
sudo cp filename /usr/sbin
"C:\Python27\python.exe" "%1" %*
"C:\Windows\py.exe" "%1" %*
#!/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())
#!/bin/bash
"true" '''\'; source $(cd $(dirname ${BASH_SOURCE[@]}) &>/dev/null && pwd)/select.sh; exec $CHOSEN_PYTHON "$0" "$@"; exit 127; '''
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