【问题标题】:Any reason not to use /usr/bin/env python2/python3 explicitly? [closed]有什么理由不明确使用 /usr/bin/env python2/python3 吗? [关闭]
【发布时间】:2017-12-16 05:11:34
【问题描述】:

我经常在.py 文件的顶部看到这个:

#!/usr/bin/env python

由于操作系统默认状态未知,我想知道为什么不是:

#!/usr/bin/env python2
#!/usr/bin/env python3

如果大多数操作系统都提供这个版本符号链接,那不是更好吗?

我在环顾四周时发现了PEP 394,这表明目前,开发人员应该假设python -> python2 -> python2.x。它指出,可以假设存在版本化等效项python3python2。那么,任由机会和提供额外的角色有什么害处?

如果一个人没有安装python2,因为操作系统默认附带python -> python3(如Arch linux),我在运行脚本或程序时更喜欢这个问题:

/usr/bin/env: ‘python2’: No such file or directory

另外,这个错误更严重,特别是对于新用户(python 存在,只是版本错误):

File "<stdin>", line 1
  print 'Hello world'
                    ^
SyntaxError: Missing parentheses in call to 'print'

也就是说,我发现后者更为常见。至少现在我知道一些典型的兼容性错误足以让我自己思考“哦,对。它是 python 符号链接。”

两个问题询问如何指定/验证所需的版本:

  • This 2010 question 建议将python 视为python2python3 的含义,以显式调用python3

  • This 2013 question:可能暗示不应该使用python3,因为并非所有发行版都附带它?

如果大多数操作系统都提供了版本化的env 调用,我(或python 程序员)不应该是否有明显的原因?只使用 python 似乎迎合了少数没有版本化命令的人,同时给绝大多数人造成了困惑。

也许答案 使用版本化命令(我从 PEP 394 中得到),但还没有足够的时间看到它们出现。迄今为止,我从未见过版本化的env 电话......再说一次,如果它有效,我从不看。如果它坏了,它总是一个无版本的python 行,所以我的心理计数可能有偏差!


关于搜索的一些 github 统计信息;我很好奇用法:

  • #!/usr/bin/env python2: ~210k python 文件代码命中
  • #!/usr/bin/env python3: ~460k
  • #!/usr/bin/env python: ~600 万

这可能意味着大多数代码已经足够老了,如果上述问题的建议是流行的智慧,人们只是没有更新他们的文件?


我查看了这些流行的操作系统,发现它们都使用版本化命令:

【问题讨论】:

  • 如果您的代码与 Python2/3 兼容,您可以只使用 #!/usr/bin/env python。但我认为以这种方式工作的代码量非常少。其中大部分是 Python 3 之前的遗产,包括仍然建议使用 /usr/bin/env python 的教程等,而没有警告后果。
  • fwiw,windows上python的默认安装遵守pep394——它只提供python.exepythonw.exe
  • @Evert 当然,在我写完这篇文章之后,我才恍然大悟:) 我想我刚刚看到了一个例子,里面有一些 import __future__ 的东西,现在这很有意义。非常有效,如果您编写了兼容的代码,则无需关心。
  • 这个问题是我不建议任何人学习 python 或将它用于任何事情的第一大原因。
  • 这个问题很隐蔽,因为它最终出现在用户的机器上,并且没有令人满意的解决方案。别误会,我喜欢python3;但是我们需要解决人们和他们的机器认为所有python脚本都兼容所有解释器版本的问题。

标签: python environment-variables versioning


【解决方案1】:

当您编写脚本时,您可能会对特定版本的 Python 产生各种依赖。使用字典理解?你至少需要 Python 2.7。使用async 关键字?您至少需要 Python 3.5。

当您使用#!/usr/bin/env python 时,您并没有说任何关于执行脚本需要哪个版本的Python;您只是在说“首先使用在您的路径中找到的任何版本的 Python。”从根本上说,开发者是错误的人来指定 shebang。

相反,用户应该将shebang设置为他们的系统上正确版本的Python的路径。

distutils 包在这里取得了很好的折衷。您,开发人员,只需将#!python 放入您的脚本中。当您通过python setup.py install 安装脚本时,安装程​​序会将#!python 替换为目标机器上正确的路径。

【讨论】:

  • 我有点明白...但“我的系统”也是安装​​在其上的所有软件的集合。所以,假设我想在python3 中编码,我的操作系统(arch)假设python == python3,我从为 v2.7 编写的某人(like this)安装软件。哪个是我的系统的“正确”版本?
  • 另外,如果开发者在他/她的代码中有一个print 'blah' 的实例,那么他们已经指定了shebang(隐式)。我的部分问题是间接询问为什么当前编写/更新的软件不承认这一点(这让我想知道是否可能有比“因为历史是用python2 编写的,这就是我们一直在做的事情”) .
  • 不是用户; installer 应该设置 hash-bang(无论安装程序是包管理器、管理员还是最终用户都无关紧要)。
  • @Evert 谢谢,这是一个很好的说明。对于运行包管理器的人,我使用“用户”作为(有意)模糊的替身。
猜你喜欢
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2019-05-29
  • 2014-03-03
  • 2011-11-28
相关资源
最近更新 更多