#!/ usr / bin / python和#!/ usr / bin / env python,哪些支持?
Python脚本的shebang应该怎么样?
有些人支持#!/usr/bin/env python
因为它可以智能地找到Python解释器。 其他人支持#!/usr/bin/python
,因为现在在大多数GNU / Linux发行版中, python
是默认程序。
两种变体有什么好处?
Debian Python政策指出:
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应用程序的系统安装。 让这些使用系统管理版本的python是非常有意义的。 如果你实际上是在自己定制的安装python而不是由操作系统管理,那么使用env
变体可能是说“使用用户首选python”的正确方式,而不是硬编码系统python安装(这将是/usr/bin/python
)或任何用户自定义路径。
如果你使用python virtualenv调用它们,使用env python
会导致你的程序行为不同。
这可能是需要的 (例如,你正在编写一个脚本,只在你的virtualenv中工作)。 它可能会有问题 (你为你写一个工具,并期望它在virtualenv中也能工作 - 它可能会突然失败,因为它会丢失包)。
我的愚见是你应该使用env
变体。 这是一个在几乎所有系统中都可以找到的POSIX组件,而直接指定/usr/bin/python
会在很多场合中断,即virtualenv设置。
我使用#!/usr/bin/env python
作为OS-X上的默认安装位置不是/usr/bin
。 这也适用于喜欢自定义环境的用户 - /usr/local/bin
是另一个可以找到python发行版的常见位置。
这就是说,这并不重要。 你可以随时用你想要的任何python版本来测试脚本: /usr/bin/strange/path/python myscript.py
。 另外,当您通过setuptools安装脚本时,shebang似乎被安装该脚本的sys.executable
替换 - 我不知道pip
,但我会假设它的行为相似。
上一篇: #!/usr/bin/python and #!/usr/bin/env python, which support?
下一篇: Bash script to kill a process if process count is over X amount