Python脚本标题

典型的标题应该是

#!/usr/bin/env python 

但是我发现下面的代码在执行$python ./my_script.py这样的脚本时也是$python ./my_script.py

 #!/usr/bin/python #!python 

这两个头文件有什么区别? 第二个问题可能是什么? 请同时讨论python解释器在PATH中的情况。 谢谢。

首先,你可以在任何时候使用解释器明确地运行脚本

 $ python ./my_script.py $ ksh ~/bin/redouble.sh $ lua5.1 /usr/local/bin/osbf3 

#! 行总是被忽略。 #! line是只有可执行脚本的Unix特性,你可以在execve(2)的手册页上看到完整的文档。 在那里你会发现#!下面的单词#! 必须是有效的可执行文件的path名。 所以

 #!/usr/bin/env python 

执行用户$PATH任何python 。 这种forms对于Python解释器的移动是有弹性的,这使得它更具可移植性,但是这也意味着用户可以通过在$PATH放置一些东西来覆盖标准的Python解释器。 根据你的目标,这种行为可能会也可能不会。

下一个,

 #!/usr/bin/python 

处理Python解释器安装在/usr/bin的常见情况。 如果它被安装在别的地方,你会失败。 但是,这是确保您获得完全所需版本的好方法,否则什么也不做(“失败 – 停止”行为),如

 #!/usr/bin/python2.5 

最后,

 #!python 

只有当脚本运行时当前目录中有一个python可执行文件才有效。 不build议。

我会在你的脚本开头build议3件事情:

首先,正如已经说过的使用环境:

 #!/usr/bin/env python 

其次,设置你的编码:

 # -*- coding: utf-8 -*- 

三,设置一些文档string:

 """This is a awesome python script!""" 

当然,我会用" " (4个空格)作为身份证。
最终的标题将如下所示:

 #!/usr/bin/env python # -*- coding: utf-8 -*- """This is a awesome python script!""" 

祝愿和愉快的编码。

Python可执行文件可能安装在/ usr / bin以外的位置,但env几乎总是存在于该位置,因此使用/usr/bin/env更便于携带。

env的手册页(GNU coreutils 6.10):

 env - run a program in a modified environment 

理论上你可以使用env来重置环境(删除许多现有的环境variables),或者在脚本头文件中添加额外的环境variables。 实际上,你提到的两个版本是相同的。 (虽然其他人提到了一个很好的观点:通过env指定python可以在不知道path的情况下抽象地指定python 。)

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

当使用virtualenv时,它甚至可能是~/projects/env/bin/python

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

随着越来越多的人开始使用virtualenv进行python开发,除非你不想让人们使用自定义的python二进制文件,否则更喜欢使用/usr/bin/env python

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