Python脚本头


79

典型的标头应为

#!/usr/bin/env python

但是我发现以下在执行脚本时也可以使用 $python ./my_script.py

#!/usr/bin/python
#!python

这2个标头之间有什么区别?第二个可能是什么问题?还请讨论python解释器是否在PATH中的情况。谢谢。



4
仅供参考,当您以某种方式$ python ./my_script.pypython明确指定)运行脚本时,shebang(#!)行将被忽略。仅当您将脚本作为可执行文件运行时,它才有效$ ./my_script.py
David Z 2010年

@David Zaslavsky:+1不错。
Mark Byers 2010年

Answers:


103

首先,每次您使用显式解释器显式运行脚本时,如

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

#!行始终被忽略。该#!行仅是可执行脚本的Unix功能,您可以在的手册页execve(2)上完整查看该文件。在那里,您将发现单词following#!必须是有效可执行文件的路径名。所以

#!/usr/bin/env python

执行python用户上的一切$PATH。这种形式对移动的Python解释器具有弹性,这使其更具可移植性,但是这也意味着用户可以通过在其前面放一些东西来覆盖标准Python解释器$PATH。根据您的目标,此行为可能会或可能不会正常。

下一个,

#!/usr/bin/python

处理在中安装Python解释器的常见情况/usr/bin。如果将其安装在其他地方,您将会迷失方向。但这是确保您完全获得所需版本的好方法,否则就什么也没有(“失败停止”行为),例如

#!/usr/bin/python2.5

最后,

#!python

python运行脚本时,仅当当前目录中有可执行文件时,此文件才有效。不建议。


28


我建议在脚本开始时做三件事:

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

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


最好的祝福和快乐的编码。


只是为了支持对选项卡上的空格的看似固执的评论:“空格是首选的缩进方法。” (python.org/dev/peps/pep-0008/#tabs-or-spaces
deepelement

5

Python可执行文件可能安装在/ usr / bin之外的其他位置,但是env几乎始终存在于该位置,因此使用起来/usr/bin/env更加可移植。


2

env(GNU coreutils 6.10)的手册页中:

env - run a program in a modified environment

从理论上讲,您可以env用来重置环境(删除许多现有的环境变量)或在脚本头中添加其他环境变量。实际上,您提到的两个版本是相同的。(尽管其他人提到了一个好处:python通过指定env,您可以抽象地指定python而不知道其路径。)


1

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

使用virtualenv时,它甚至可能类似于 ~/projects/env/bin/python


0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.