#!/ usr/bin/python和#!/ usr/bin/env python,哪个支持?

Tan*_*Woo 10 python shebang

Python脚本的shebang应该怎么样?

有些人支持,#!/usr/bin/env python因为它可以智能地找到Python解释器.其他人支持#!/usr/bin/python,因为现在大多数GNU/Linux发行版python都是默认程序.

这两种变体有什么好处?

Ano*_*sse 8

Debian的Python的政策规定:

Python解释器的首选规范是/usr/bin/python/usr/bin/pythonX.Y.这确保了使用了python的Debian安装,并且满足了对其他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.我想要自动安全升级,所以我通过安装我所有的python需求aptitude.使用官方Debian/Ubuntu软件包让我的系统比我自己搞乱python安装更清洁.


让我强调一件事.上面的建议是指python应用程序的系统安装.让这些使用python 的系统管理版本是完全合理的.如果您实际上正在玩自己的,不受操作系统管理的自定义python安装,使用该env变体可能说"使用用户首选的python"的正确方式,而不是对系统进行硬编码python安装(可能是/usr/bin/python)或任何用户自定义路径.

env python如果你从例如python virtualenv中调用它们,则使用将导致程序的行为不同.

可能是期望的(例如,您正在编写脚本以在您的virtualenv中工作).它可能会有问题(你为你编写一个工具,并期望它甚至在virtualenv中工作相同 - 它可能会突然失败,因为它丢失了包).

  • 我所说的是*并非所有优秀的python扩展都可用作包*(一个例子 - `spacepy`).并且*并非所有用户都有权在系统范围内安装扩展*最后,*并非所有用户都使用Ubuntu/Debian*(`/ usr/bin/python`在OS-X上失败).如果使用`/ usr/bin/env`,用户仍然可以选择使用系统范围的python - 他们只需要正确管理他们的环境(他们应该在任何情况下都这样做).但是再次 - 正如我在答案中所说的那样,无论如何,这都不是什么大问题.你总是可以在安装了任何python的情况下尝试你的脚本. (2认同)

fil*_*mor 6

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