我应该把shebang放在我的Python脚本中吗?以什么形式?
#!/usr/bin/env python
or
#!/usr/local/bin/python
它们同样便携吗?哪种形式使用最多?
注意:龙卷风项目使用shebang。另一方面,Django项目没有。
我应该把shebang放在我的Python脚本中吗?以什么形式?
#!/usr/bin/env python
or
#!/usr/local/bin/python
它们同样便携吗?哪种形式使用最多?
注意:龙卷风项目使用shebang。另一方面,Django项目没有。
当前回答
如果脚本是可执行的,则应该添加shebang。您还应该使用安装软件来安装脚本,该安装软件将shebang修改为正确的内容,以便它能够在目标平台上工作。distutils和Distribute就是这样的例子。
其他回答
如果脚本是可执行的,则应该添加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标志类似的行为。
对于想要从命令行执行的文件,我建议使用
#! /usr/bin/env python3
否则你就不需要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
我应该把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。