为什么“#!/ usr / bin / env python”比“#!/ usr / bin / python”更正确?


70

有人知道吗?我从来没有找到答案。


4
不是一吨。我在osx上,env联机帮助页在那里模棱两可。
肯尼思·雷兹

16
@美国洛特:有最近读过吗?在我的Debian盒子上,它是我见过的最无益的手册页之一,这是在说些什么。(以下是整个“描述”:在环境中将每个名称设置为VALUE并运行COMMAND。是的,这样可以将他清除干净。)
Telemachus,2009年

@Telemachus:是的,我确实读过它。这就是为什么我找到Wikipedia条目的原因。
S.Lott

4
env的一个问题是您不能添加-u或其他任何要传递给python可执行文件的选项
Arkady,2009年

1
这里是一个非常相关的Unix SE问题的很好答案。
艾伯特

Answers:


67

如果您倾向于在PATH的各个有趣位置安装python(如在$PATH典型的Unix shell中,%PATH在典型的Windows shell中),/usr/bin/env则在直接进入时,使用会适应您的想法(至少在类Unix环境中)。/usr/bin/python惯于。但是失去对脚本运行于哪个版本的Python的控制绝不是讨价还价...如果看我的代码,您更有可能看到它以例如,#!/usr/local/bin/python2.5而不是打开并接受#!/usr/bin/env python-假设脚本开头重要的是我想确保它可以与我测试并开发过的特定版本一起运行,而不是半随机版本;-)。


39
当然,您始终可以使用#!/ usr / bin / env python2.5来约束半随机选择集:=)
Ned Deily

1
+1很棒的解释,谢谢!在...之前,我还没有遇到过“ env”的用法。现在,我有一些东西可以添加到我的脚本技巧包中。
吉姆·刘易斯,

3
+1表示不使用“ env python”的理由。让我意识到,如果我想使用“ env python”,则最好编写最低公分母的代码,因为我无法控制用户在PATH中首先使用的python版本。
格琳·杰克曼(09年

15
-1有几个原因:/ usr / local / bin不是python的标准路径,仅适用于本地编译的安装;在shebang上强制执行次要版本是个坏主意:可以保护它免受2.4攻击,但它也声称您的脚本与2.6或2.7不兼容。次要版本限制是distutils / setup.py,软件包管理系统或有条件导入的任务,而不是shebang;同样,如@Ned所说,如果系统未提供路径,则不应硬编码路径或阻止用户在〜/ bin中使用python 2.5。因此,不利于未来发展和糟糕的可移植性。
MestreLion 2012年

3
还请注意,使用#!/usr/bin/env python和virtualenvs将在当前venv中执行脚本!这可能不是好事,取决于您的用例。
Pax0r 2015年

25

来自维基百科

Shebangs指定系统可执行文件的绝对路径;这会在具有非标准文件系统布局的系统上引起问题

通常,可以使用程序/ usr / bin / env来规避此限制


10

它会在您的环境中找到python可执行文件并使用它。它更可移植,因为python可能并不总是位于/ usr / bin / python中。env始终位于/ usr / bin中。


env并不总是存在的,但是我们正在增加脚本在更多机器上找到python的可能性。:)
威尔

5

它也在/ usr / local / bin,〜/ bin,/ opt / bin,...或可能隐藏的任何位置中找到“ python”。


谢谢!它实际上对我造成了问题,因为出于某种原因,env不存在。
肯尼思·雷兹

3
这有点误导。只会在当前$ PATH上找到第一个“ python”,而OS X上的Python实例可以很好地隐藏。特别是,从python.org构建的标准框架以及其他在框架中具有“ bin”子目录的框架,其中存储了“ python”以及其他可执行文件和脚本。最终很容易遇到多个实例,这些实例在通常的位置可能具有也可能没有符号链接,例如/ usr / local / bin等。在这种情况下,在OS X上管理$ PATH并不像在没有框架样式构建的系统上那样简单。
内德·迪利

2
@KennethReitz:如果/usr/bin/env不存在,则您的系统已损坏。env是POSIX标准必需的工具。
MestreLion 2012年

@MestreLion,运行python不需要POSIX。
dadinck

@KennethReitz:是的,但是shebangs仅在POSIX环境中使用。Windows(和python)会忽略它们,因此我假设您在* nix环境中,否则您的原始问题就没有意义了。
MestreLion

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.