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

时间:2012-12-14 13:26:43

标签: python shebang

Python脚本的shebang应该如何?

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

这两种变体有什么好处?

4 个答案:

答案 0 :(得分:8)

Debian Python Policy 声明:

  

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

     

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

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

请注意我从未使用pip 。我想要自动安全升级,所以我通过aptitude安装我所有的python需求。使用官方的Debian / Ubuntu软件包让我的系统更加更清洁而不是我自己搞乱python安装。


让我强调一件事。上面的建议是指python应用程序的 system 安装。让这些使用 system 托管版本的python是非常有意义的。如果您实际上正在使用自己的,由操作系统 管理的python的自定义安装,使用env变体可能正确的方法说“使用用户首选的python”,而不是硬编码系统python安装(可能是/usr/bin/python)或任何用户自定义路径。

使用env python会导致您的程序以不同的方式进行调用一个python virtualenv。

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

答案 1 :(得分:6)

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

答案 2 :(得分: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,但我认为它的行为类似

答案 3 :(得分:1)

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

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