我应该把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的目的是让脚本在希望从shell执行脚本时识别解释器类型。 大多数情况下,但并不总是这样,通过在外部提供解释器来执行脚本。 使用示例:python-x。x script.py
即使没有shebang声明器,这也可以工作。
为什么第一个更“可移植”是因为,/usr/bin/env包含你的PATH声明,它说明了你的系统可执行文件所在的所有目的地。
注意:Tornado没有严格使用shebang, Django也没有严格使用shebang。这取决于您如何执行应用程序的主要功能。
另外:它不会随Python而变化。
其他回答
这只是个人口味的问题。添加shebang意味着人们可以直接调用脚本(假设它被标记为可执行);省略它只意味着必须手动调用python。
运行程序的最终结果不会受到任何影响;这只是手段的选择。
答:只有当您计划使它成为一个命令行可执行脚本时。
步骤如下:
首先验证要使用的正确的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
这样它就可以在任何地方工作(在文件名之前没有。/)
shebang的目的是让脚本在希望从shell执行脚本时识别解释器类型。 大多数情况下,但并不总是这样,通过在外部提供解释器来执行脚本。 使用示例:python-x。x script.py
即使没有shebang声明器,这也可以工作。
为什么第一个更“可移植”是因为,/usr/bin/env包含你的PATH声明,它说明了你的系统可执行文件所在的所有目的地。
注意:Tornado没有严格使用shebang, Django也没有严格使用shebang。这取决于您如何执行应用程序的主要功能。
另外:它不会随Python而变化。
使用第一个
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