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