典型的头应该是Python脚本头
#!/usr/bin/env python
但我发现下面执行像$python ./my_script.py
#!/usr/bin/python
#!python
什么是这两个标题之间的区别脚本时也工作?第二个问题可能是什么?还请讨论python解释器在PATH中的情况。谢谢。
典型的头应该是Python脚本头
#!/usr/bin/env python
但我发现下面执行像$python ./my_script.py
#!/usr/bin/python
#!python
什么是这两个标题之间的区别脚本时也工作?第二个问题可能是什么?还请讨论python解释器在PATH中的情况。谢谢。
首先,任何时候你使用解释明确运行脚本,如
$ python ./my_script.py
$ ksh ~/bin/redouble.sh
$ lua5.1 /usr/local/bin/osbf3
#!
行始终被忽略。 #!
行是可执行脚本的Unix功能,您可以在man page for execve(2)
上看到它的完整记录。您会发现在#!
之后的单词必须是有效可执行文件的路径名。所以
#!/usr/bin/env python
执行任何python
是对用户$PATH
。这种形式对于Python解释器的移动具有一定的适应性,这使得它更具可移植性,但这也意味着用户可以通过在$PATH
之前放置标准Python解释器来覆盖标准Python解释器。根据你的目标,这种行为可能会也可能不会。
接着,与Python解释安装在/usr/bin
常见的情况
#!/usr/bin/python
交易。如果它被安装在别的地方,你会失败。但是,这是为了确保你得到你想要的,否则根本完全版本没有什么(“故障停止”的行为)的好方法,如
#!/usr/bin/python2.5
最后,
#!python
只能当脚本运行时,当前目录中有一个python
可执行文件。不建议。
是的,有 - python可能不在/usr/bin
中,但例如在/usr/local/bin
(BSD)中。
使用的virtualenv,它甚至可能像~/projects/env/bin/python
Python的可执行文件可能会在在/ usr/bin中的其他位置安装,但env
几乎总是出现在那个位置,所以使用/usr/bin/env
更便于携带。
从联机帮助页env
(GNU的coreutils 6.10):
env - run a program in a modified environment
从理论上讲,你可以使用env
在脚本头重置环境(去除许多现有的环境变量),或者添加附加的环境变量。实际上,你提到的两个版本是相同的。 (虽然其他人都提到一个很好的点:通过env
指定python
让你抽象指定python
不知道它的路径)
当您的脚本依赖于环境设置,例如使用依赖于python virtualenv
的脚本时,/usr/bin/env python
变得非常有用。每个virtualenv都有自己的python二进制版本,这是将virtualenv中安装的软件包添加到python路径中所必需的(不需要触摸PYTHONPATH env)。
随着越来越多的人开始使用virtualenv进行python开发宁愿使用/usr/bin/env python
,除非您不希望人们使用他们的自定义python二进制文件。
注意:当让人们在自定义环境中运行脚本时,您还应该明白存在潜在的安全问题(在多用户环境中)。你可以从here得到一些想法。
我建议三样东西在你的脚本的开头:
首先,作为已被说使用环境:
#!/usr/bin/env python
二,设置您的编码:
# -*- coding: utf-8 -*-
三,设置一些文档字符串:
"""This is a awesome
python script!"""
当然,我会用" "
(4个空格)作为身份证。
最后头的样子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""This is a awesome
python script!"""
最良好的祝愿,幸福的编码。
这个头被称为家当http://en.wikipedia.org/wiki/Shebang_%28Unix%29 – systempuntoout 2010-06-27 19:53:43
FYI当您运行的方式'$蟒蛇的脚本。/ my_script.py'(指定'python'明确),shebang('#!')行被忽略。只有将脚本作为可执行文件运行时才有效果,例如'$。/ my_script.py'。 – 2010-06-27 20:08:56
@David Zaslavsky:+1好的。 – 2010-06-27 20:10:55