2010-06-27 60 views
58

典型的头应该是Python脚本头

#!/usr/bin/env python 

但我发现下面执行像$python ./my_script.py

#!/usr/bin/python 
#!python 

什么是这两个标题之间的区别脚本时也工作?第二个问题可能是什么?还请讨论python解释器在PATH中的情况。谢谢。

+2

这个头被称为家当http://en.wikipedia.org/wiki/Shebang_%28Unix%29 – systempuntoout 2010-06-27 19:53:43

+3

FYI当您运行的方式'$蟒蛇的脚本。/ my_script.py'(指定'python'明确),shebang('#!')行被忽略。只有将脚本作为可执行文件运行时才有效果,例如'$。/ my_script.py'。 – 2010-06-27 20:08:56

+0

@David Zaslavsky:+1好的。 – 2010-06-27 20:10:55

回答

70

首先,任何时候你使用解释明确运行脚本,如

$ 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可执行文件。不建议。

1

是的,有 - python可能不在/usr/bin中,但例如在/usr/local/bin(BSD)中。

使用的virtualenv,它甚至可能像~/projects/env/bin/python

5

Python的可执行文件可能会在在/ usr/bin中的其他位置安装,但env几乎总是出现在那个位置,所以使用/usr/bin/env更便于携带。

2

从联机帮助页env(GNU的coreutils 6.10):

env - run a program in a modified environment 

从理论上讲,你可以使用env在脚本头重置环境(去除许多现有的环境变量),或者添加附加的环境变量。实际上,你提到的两个版本是相同的。 (虽然其他人都提到一个很好的点:通过env指定python让你抽象指定python不知道它的路径)

0

当您的脚本依赖于环境设置,例如使用依赖于python virtualenv的脚本时,/usr/bin/env python变得非常有用。每个virtualenv都有自己的python二进制版本,这是将virtualenv中安装的软件包添加到python路径中所必需的(不需要触摸PYTHONPATH env)。

随着越来越多的人开始使用virtualenv进行python开发宁愿使用/usr/bin/env python,除非您不希望人们使用他们的自定义python二进制文件。

注意:当让人们在自定义环境中运行脚本时,您还应该明白存在潜在的安全问题(在多用户环境中)。你可以从here得到一些想法。

16


我建议三样东西在你的脚本的开头:

首先,作为已被说使用环境:

#!/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!""" 


最良好的祝愿,幸福的编码。