Python脚本的shebang应该怎么写?
一些人支持#!/usr/bin/env python
,因为它可以智能地找到Python解释器。另一些人支持#!/usr/bin/python
,因为现在在大多数GNU/Linux发行版中,python
是默认程序。
这两种变体的好处是什么?
Python解释器的首选规范是
/usr/bin/python
或/usr/bin/pythonX.Y
。这确保了使用Debian安装的python并满足所有附加python模块的依赖关系。维护人员不应使用
/usr/bin/env python
或/usr/bin/env pythonX.Y
覆盖Debian Python解释器。这样做并不明智,因为它会绕过Debian的依赖检查,并使软件包容易受到本地安装的python不完整的影响。
请注意,Debian / Ubuntu使用备选系统来管理实际指向/usr/bin/python
的版本。对于我来说,至少在许多python版本中工作得非常好(我现在已经使用2.3到2.7的版本),在更新时具有出色的转换。
请注意,我从未使用过pip
。 我希望进行自动安全升级,因此通过aptitude
安装我所有的python需求。使用官方的Debian/Ubuntu软件包比我自己搞python安装使系统更加清洁。
让我强调一件事情。上述建议是针对系统安装python应用程序的。使用系统管理的python版本是完美的选择。如果您实际上在自己定制的python安装中进行操作,这与操作系统无关,那么使用env
变体可能是正确的方法,以便“使用用户首选的python”,而不是硬编码任何用户自定义路径或系统python安装(它将是/usr/bin/python
)。
env python
会导致程序行为不同。这可能是需要的(例如,您正在编写一个仅在虚拟环境中工作的脚本)。它也可能有问题(您为自己编写了一个工具,并期望即使在虚拟环境中也能正常工作-但会因缺少软件包而突然失败)。
我认为你应该使用env
变量。它是POSIX组件,因此几乎在每个系统中都可以找到,而直接指定/usr/bin/python
会在许多情况下出错,例如virtualenv设置。
env python
将产生预期的 Python 安装。因此,如果一个共享的 Python 程序在不同的虚拟环境中运行,它将突然失败,而不是最初预期的那样...为了使用虚拟环境,我建议始终以 python script.py
的方式运行你的脚本(但对于只能在你的虚拟环境中工作的脚本,env python
方法可能更好;但仍然会使可移植性成为问题)。 - Has QUIT--Anony-Mousseenv
意味着您将使用当前由 python something.py
解析的 Python。这正是我想要的。如果我想使用不同的解释器,我会切换环境。这不是我希望脚本作者为我做出的决定。对于您发行版的软件包维护者来说,情况完全不同,他们应该强制执行系统解释器。 - filmor#!/usr/bin/env python
作为默认安装位置,因为在OS-X上不是/usr/bin
。这也适用于喜欢自定义环境的用户 -- /usr/local/bin
是另一个常见的你可能会找到python发行版的地方。/usr/bin/strange/path/python myscript.py
。此外,当你通过setuptools安装脚本时,shebang似乎会被安装该脚本的sys.executable
所替换 -- 我不知道pip
,但我认为它表现类似。正如您所指出的,它们可能都在Linux上工作。但是,如果有人为自己安装了更新版本的Python,或者某些要求使人们将特定版本保留在/usr/bin中,那么env允许调用者设置他们的环境,以便通过env调用不同的版本。
想象一下有人试图查看Python 3是否与脚本配合使用。他们将首先在其路径中添加python3解释器,但希望保持系统默认运行2.x。使用硬编码路径是不可能的。
test-python-installation/bin/python app.py
。 - Has QUIT--Anony-Mousse
pip
或easy_install
,或者你需要自己安装python setup.py
。 - mgilsonnumpy
?没问题。如果需要它,则需要以某种方式获取它。需要spacepy
?我认为它并不在任何存储库中,但我使用它(据我所知它没有损坏)。我知道您可以将扩展添加到系统Python中。您也可以选择尽可能保持其原始状态,并设置自己的版本以在用户空间中工作。/usr/bin/env
允许用户决定。 - mgilsonspacepy
)。而且,并非所有用户都有权限在系统范围内安装扩展,最后,并非所有用户都在使用Ubuntu/Debian(/usr/bin/python
在OS-X上失败)。 如果您使用/usr/bin/env
,则用户仍然可以选择使用系统范围内的Python-他们只需要适当地管理自己的环境(无论如何他们都应该这样做)。 但再次强调- 如我在回答中所述,这真的并不重要。 您始终可以尝试使用任何安装了Python的脚本。 - mgilson