【问题标题】:Why is '#!/usr/bin/env python' supposedly more correct than just '#!/usr/bin/python'?为什么 '#!/usr/bin/env python' 比 '#!/usr/bin/python' 更正确?
【发布时间】:2009-08-30 02:30:30
【问题描述】:

有人知道吗?我一直没能找到答案。

【问题讨论】:

  • 不是很多。我在 osx 上,并且 env 手册页在那里相当模糊。
  • @S.Lott:最近读了吗?在我的 Debian 机器上,它是我见过的最无用的手册页之一,这说明了一些问题。 (这是整个“描述”:在环境中将每个 NAME 设置为 VALUE 并运行 COMMAND。是的,这会立即清除他。)
  • @Telemachus:是的,我确实读过它。这就是我找到维基百科条目的原因。
  • env 的一个问题是你不能添加 -u 或任何其他选项来传递给 python 可执行文件
  • 关于一个非常相关的 Unix SE 问题的一个很好的答案是here

标签: python bash


【解决方案1】:

如果您倾向于在 PATH 上各种有趣的地方安装 python(如典型 Unix shell 中的 $PATH,典型 Windows shell 中的 %PATH),使用 /usr/bin/env 将满足您的心血来潮(嗯,至少在类 Unix 环境中)而直接访问 /usr/bin/python 不会。但是失去对你的脚本运行的 Python 版本的控制并不是纯粹的讨价还价......如果你查看我的代码,你更有可能看到它以 #!/usr/local/bin/python2.5 开头,而不是打开并接受 @987654326 @ -- 假设脚本很重要,我希望确保它使用我测试和开发过的特定版本运行,而不是半随机版本;-)。

【讨论】:

  • 当然,你总是可以使用#!/usr/bin/env python2.5 来约束半随机选择集:=)
  • +1 很好的解释,谢谢!我以前没有遇到过“env”的这种用法……现在我有一些东西可以添加到我的脚本技巧包中。
  • +1 表示不使用“env python”的理由。让我意识到,如果我想使用“env python”,我最好为最小公分母编码,因为我无法控制用户在 PATH 中首先拥有的 python 版本。
  • -1 有几个原因:/usr/local/bin 不是 python 的标准路径,仅适用于 本地编译的安装;在 shebang 强制执行次要版本是一个坏主意:可能会保护 2.4,但它也声称您的脚本与 2.6 或 2.7 不兼容。次要版本限制是 distutils/setup.py 的任务,包管理系统,或者条件导入,not shebang;此外,正如@Ned 所说,如果系统不提供路径,则不应硬编码路径或阻止用户在 ~/bin 中使用他的 python 2.5。 因此,糟糕的面向未来和糟糕的可移植性。
  • 请注意,使用#!/usr/bin/env python 和 virtualenvs 将在当前 venv 中执行脚本!这可能是也可能不是一件好事,取决于您的用例。
【解决方案2】:

来自wikipedia

Shebangs 指定系统可执行文件的绝对路径;这可能导致 具有非标准文件系统布局的系统上的问题

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • env 并不总是存在,但我们正在增加脚本在更多机器上找到 python 的可能性。 :)
    【解决方案4】:

    它还在 /usr/local/bin、~/bin、/opt/bin、... 或它可能隐藏的任何地方找到“python”。

    【讨论】:

    • 谢谢!它实际上给我带来了问题,因为出于某种原因,env 不存在。
    • 这有点误导。它只会在您当前的 $PATH 上找到第一个“python”,而 OS X 上的 Python 实例可以很好地隐藏。特别是,从 python.org 构建的标准框架和其他框架在存储“python”和其他可执行文件和脚本的框架中有“bin”子目录。很容易得到多个实例,这些实例在通常的地方可能有也可能没有符号链接,比如 /usr/local/bin 等。在这种情况下,在 OS X 上管理 $PATH 并不像在没有框架风格构建的系统上那样简单。
    • @KennethReitz:如果/usr/bin/env 不存在,你的系统就坏了。 env是 POSIX 标准的必需工具。
    • @MestreLion,POSIX 不是运行 python 的要求。
    • @KennethReitz:是的,但 shebangs 仅在 POSIX 环境中使用。 Windows(和 python)忽略它们,所以我假设你在 *nix 环境中,否则你原来的问题是没有实际意义的。
    【解决方案5】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-16
      • 2014-03-03
      • 2021-06-08
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      相关资源
      最近更新 更多