tre*_*der 741 python shell shebang python-3.x
我应该把shebang放在我的Python脚本中吗?以什么形式?
#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
要么
#!/usr/local/bin/python
Run Code Online (Sandbox Code Playgroud)
这些同样便携吗?哪种形式最常用?
Gla*_*ost 1001
任何脚本中的shebang行都可以确定脚本的执行能力,就像独立的可执行文件一样,无需python事先在终端中输入或在文件管理器中双击它(如果配置正确).没有必要,但通常放在那里,所以当有人看到在编辑器中打开文件时,他们立即知道他们正在看什么.但是,您使用的家当线IS重要.
Python 3脚本的正确用法是:
#!/usr/bin/env python3
Run Code Online (Sandbox Code Playgroud)
默认为版本3.latest.对于Python 2.7.latest python2来代替python3.
不应使用以下内容(除了极少数情况下,您编写的代码与Python 2.x和3.x兼容):
#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
在PEP 394中给出这些建议的原因是python可以指代python2或python3不同的系统.它目前指的是python2大多数发行版,但这可能会在某些时候发生变化.
另外,请勿使用:
#!/usr/local/bin/python
Run Code Online (Sandbox Code Playgroud)
"在这些情况下,python可以安装在/ usr/bin/python或/ bin/python中,上面的#!将会失败."
- "#!/ usr/bin/env python"vs"#!/ usr/local/bin/python"
Amb*_*ber 68
这真的只是品味问题.添加shebang意味着人们可以根据需要直接调用脚本(假设它被标记为可执行文件); 省略它只是意味着python必须手动调用.
运行程序的最终结果不受任何影响; 它只是手段的选择.
jfs*_*jfs 29
我应该把shebang放在我的Python脚本中吗?
将shebang放入Python脚本中以指示:
python显式调用可执行文件,则必须使用它这些同样便携吗?哪种形式最常用?
如果您手动编写一个shebang ,那么#!/usr/bin/env python除非您有特殊原因不使用它,否则请始终使用.甚至在Windows(Python启动器)上也可以理解这种形式.
注意:安装的脚本应该使用特定的python可执行文件,例如,/usr/bin/python或/home/me/.virtualenvs/project/bin/python.如果你在shell中激活virtualenv,一些工具会中断,这很糟糕.幸运的是,在大多数情况下,setuptools或者您的分发包工具会自动创建正确的shebang (在Windows上,setuptools可以.exe自动生成包装脚本).
换句话说,如果脚本在源结帐中,那么您可能会看到#!/usr/bin/env python.如果已安装,则shebang是特定python可执行文件的路径,例如#!/usr/local/bin/python (注意:您不应手动编写后一类别的路径).
要选择是否应该使用python,python2或者python3在shebang中,请参阅PEP 394 - 类Unix系统上的"python"命令:
...
python仅适用于与Python 2和3兼容的脚本的shebang行.为了准备Python的默认版本的最终更改,Python 2的脚本应该更新为与Python 3源代码兼容,或者
python2在shebang行中使用.
Chr*_*son 15
如果你有多个版本的Python并且脚本需要在特定版本下运行,那么she-bang可以确保在直接执行脚本时使用正确的脚本,例如:
#!/usr/bin/python2.7
Run Code Online (Sandbox Code Playgroud)
请注意,脚本仍然可以通过完整的Python命令行运行,或者通过导入运行,在这种情况下,将忽略she-bang.但是对于直接运行的脚本,这是使用she-bang的一个正当理由.
#!/usr/bin/env python 通常是更好的方法,但这有助于特殊情况.
通常最好建立一个Python虚拟环境,在这种情况下,泛型#!/usr/bin/env python将为virtualenv识别正确的Python实例.
Len*_*bro 10
如果脚本是可执行的,您应该添加一个shebang.您还应该使用安装软件安装脚本,该软件将shebang修改为正确的内容,以便它可以在目标平台上运行.这方面的例子是distutils和Distribute.
shebang的目的是让脚本在你想从shell执行脚本时识别解释器类型.大多数情况下,并非总是如此,您通过外部提供解释程序来执行脚本.用法示例:python-x.x script.py
即使您没有shebang声明者,这也会有效.
为什么第一个更"可移植"是因为,/usr/bin/env包含您的PATH声明,该声明考虑了系统可执行文件所在的所有目标.
注意:龙卷风不严格使用shebangs,而Django严格不使用.它取决于您执行应用程序主要功能的方式.
另外:它与Python不同.
有时,如果答案不是很清楚(我的意思是,你不能决定是或否),那么就没有太大的关系,直到答案,你可以忽略的问题是清楚的.
的#!唯一目的是为了启动脚本.Django自己加载源并使用它们.它永远不需要决定应该使用什么样的解释器.这样,#!这里实际上没有任何意义.
通常,如果它是一个模块而不能用作脚本,则无需使用#!.另一方面,模块源通常包含if __name__ == '__main__': ...至少一些功能的微不足道的测试.然后#!再次有意义.
使用的一个很好的理由#!是当你同时使用Python 2和Python 3脚本时 - 它们必须由不同版本的Python解释.这样,您必须记住python手动启动脚本时必须使用的内容(没有#!内部).如果你有这样的脚本混合,最好使用#!内部,使它们可执行,并将它们作为可执行文件启动(chmod ...).
使用MS-Windows时,#!没有任何意义 - 直到最近.Python 3.3引入了一个Windows Python Launcher(py.exe和pyw.exe),它读取该#!行,检测已安装的Python版本,并使用正确或明确需要的Python版本.由于扩展可以与程序相关联,因此在Windows中可以获得与基于Unix的系统中的执行标志类似的行为.
小智 8
当我最近在 Windows 7 上安装 Python 3.6.1 时,它还安装了 Python Launcher for Windows,它应该可以处理 shebang 行。但是,我发现 Python Launcher 没有这样做:shebang 行被忽略,并且始终使用 Python 2.7.13(除非我使用 py -3 执行脚本)。
为了解决这个问题,我必须编辑 Windows 注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command。这仍然有价值
"C:\Python27\python.exe" "%1" %*
Run Code Online (Sandbox Code Playgroud)
来自我早期的 Python 2.7 安装。我将此注册表项值修改为
"C:\Windows\py.exe" "%1" %*
Run Code Online (Sandbox Code Playgroud)
并且 Python Launcher shebang 行处理如上所述。
如果您安装了不同的模块并且需要使用特定的 python 安装,那么首先shebang 似乎是有限的。但是,您可以执行以下技巧,以允许首先将 shebang 作为 shell 脚本调用,然后选择 python。这是非常灵活的imo:
#!/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())
Run Code Online (Sandbox Code Playgroud)
或者更好的是,为了促进跨多个 python 脚本的代码重用:
#!/bin/bash
"true" '''\'; source $(cd $(dirname ${BASH_SOURCE[@]}) &>/dev/null && pwd)/select.sh; exec $CHOSEN_PYTHON "$0" "$@"; exit 127; '''
Run Code Online (Sandbox Code Playgroud)
然后 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
Run Code Online (Sandbox Code Playgroud)
首先验证要使用的正确shebang字符串:
which python
Run Code Online (Sandbox Code Playgroud)
从中取出输出并将其添加到第一行中(使用shebang #!)。
在我的系统上,它的响应如下:
$which python
/usr/bin/python
Run Code Online (Sandbox Code Playgroud)
所以你的shebang看起来像:
#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)
保存后,它仍会像以前一样运行,因为 python 会将第一行视为注释。
python filename.py
Run Code Online (Sandbox Code Playgroud)
要使其成为命令,请将其复制以删除 .py 扩展名。
cp filename.py filename
Run Code Online (Sandbox Code Playgroud)
告诉文件系统这将是可执行的:
chmod +x filename
Run Code Online (Sandbox Code Playgroud)
要测试它,请使用:
./filename
Run Code Online (Sandbox Code Playgroud)
最佳做法是将它移动到 $PATH 中的某个位置,这样您只需输入文件名本身。
sudo cp filename /usr/sbin
Run Code Online (Sandbox Code Playgroud)
这样它就可以在任何地方工作(文件名前没有 ./)