典型的标头应为
#!/usr/bin/env python
但是我发现以下在执行脚本时也可以使用 $python ./my_script.py
#!/usr/bin/python
#!python
这2个标头之间有什么区别?第二个可能是什么问题?还请讨论python解释器是否在PATH中的情况。谢谢。
典型的标头应为
#!/usr/bin/env python
但是我发现以下在执行脚本时也可以使用 $python ./my_script.py
#!/usr/bin/python
#!python
这2个标头之间有什么区别?第二个可能是什么问题?还请讨论python解释器是否在PATH中的情况。谢谢。
$ python ./my_script.py
(python
明确指定)运行脚本时,shebang(#!
)行将被忽略。仅当您将脚本作为可执行文件运行时,它才有效$ ./my_script.py
。
Answers:
首先,每次您使用显式解释器显式运行脚本时,如
$ 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
运行脚本时,仅当当前目录中有可执行文件时,此文件才有效。不建议。
我建议在脚本开始时做三件事:
首先,正如已经说过的使用环境:
#!/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!"""
最好的祝福和快乐的编码。
从env
(GNU coreutils 6.10)的手册页中:
env - run a program in a modified environment
从理论上讲,您可以env
用来重置环境(删除许多现有的环境变量)或在脚本头中添加其他环境变量。实际上,您提到的两个版本是相同的。(尽管其他人提到了一个好处:python
通过指定env
,您可以抽象地指定python
而不知道其路径。)
/usr/bin/env python
当您的脚本依赖于环境设置(例如,使用依赖于的脚本)时,变得非常有用python virtualenv
。每个virtualenv都有其自己的python二进制版本,这是将virtualenv中安装的软件包添加到python路径所必需的(无需触摸PYTHONPATH env)。
随着越来越多的人开始将virtualenv用于python开发,除非您不希望人们使用其自定义python二进制文件,否则宁愿使用virtualenv 。/usr/bin/env python
注意:您还应该了解,当让人们在其自定义环境中运行脚本时,存在潜在的安全问题(在多用户环境中)。您可以从这里获得一些想法。