10

How should the shebang for a Python script look like?

Some people support #!/usr/bin/env python because it can find the Python interpreter intelligently. Others support #!/usr/bin/python, because now in most GNU/Linux distributions python is the default program.

What are the benefits of the two variants?

4

4 回答 4

8

Debian Python 政策规定:

Python 解释器的首选规范是/usr/bin/python/usr/bin/pythonX.Y。这可确保使用 Debian 安装的 python 并满足对其他 python 模块的所有依赖项。

维护者不应使用/usr/bin/env python或覆盖 Debian Python 解释器/usr/bin/env pythonX.Y。这是不可取的,因为它绕过了 Debian 的依赖项检查,并且使包容易受到不完整的本地 python 安装的影响。

请注意,Debian/Ubuntu 使用替代系统来管理/usr/bin/python实际指向的版本。至少对我来说,这在很多 python 版本中运行得非常好(我现在一直在使用从 2.3 到 2.7 的 python),并且在更新之间具有出色的过渡。

请注意,我从未使用过pip. 我想要自动安全升级,所以我通过aptitude. 使用官方的 Debian/Ubuntu 软件包让我的系统比我自己安装 python更干净。


让我强调一件事。以上推荐是针对python应用的系统安装。让这些使用系统管理的 python 版本非常有意义。如果您实际上是在玩自己的、不受操作系统管理的自定义 python 安装,那么使用env变体可能说“使用用户首选的 python”的正确方式,而不是对系统进行硬编码python 安装(可能是/usr/bin/python)或任何用户自定义路径。

如果您从例如 python virtualenv 调用它们,使用env python将导致您的程序表现不同。

可能是需要的(例如,您正在编写一个在您的 virtualenv 中工作的脚本)。而且它可能是有问题的(您为自己编写了一个工具,并期望它即使在 virtualenv 中也能正常工作——它可能会突然失败,因为它当时缺少包)。

于 2012-12-14T13:37:35.143 回答
6

我的拙见是你应该使用env-variant。它是一个 POSIX 组件,因此几乎可以在每个系统中找到,同时/usr/bin/python在许多情况下直接指定中断,即virtualenv设置。

于 2012-12-14T13:30:50.180 回答
4

#!/usr/bin/env python在 OS-X 上使用的默认安装位置是NOT /usr/bin。这也适用于喜欢自定义环境的用户——/usr/local/bin这是另一个常见的地方,您可能会在其中找到 python 发行版。

这么说,其实也无所谓。您始终可以使用所需的任何 python 版本来测试脚本: /usr/bin/strange/path/python myscript.py. 此外,当您通过 setuptools 安装脚本时,shebang 似乎被替换为sys.executable安装该脚本的那个 - 我不知道pip,但我认为它的行为类似。

于 2012-12-14T13:29:37.570 回答
1

正如您所注意到的,它们可能都在 linux 上工作。但是,如果有人安装了更新版本的 python 供自己使用,或者某些要求使人们在 /usr/bin 中保留特定版本,则 env 允许调用者设置他们的环境,以便通过调用不同的版本环境。

想象一下有人试图查看 python 3 是否适用于脚本。他们将首先在其路径中添加 python3 解释器,但希望在 2.x 上运行的系统上保留默认值。使用不可能的硬编码路径。

于 2012-12-14T13:31:26.100 回答