【发布时间】: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。它还指出,可以假设存在版本化等效项python3 和python2。那么,不任由机会和提供额外的角色有什么害处?
如果一个人没有安装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视为python2和python3的含义,以显式调用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 万
这可能意味着大多数代码已经足够老了,如果上述问题的建议是流行的智慧,人们只是没有更新他们的文件?
我查看了这些流行的操作系统,发现它们都使用版本化命令:
- ubuntu:python-minimal 和 python3-minimal
- 拱门:python 和 python2
- fedora:python2 和 python3
- debian:与 ubuntu 相同的名称/状态
- various 来源 suggest OS X uses 版本化命令
- windows:我认为there's evidence windows 有可用的版本化命令
【问题讨论】:
-
如果您的代码与 Python2/3 兼容,您可以只使用
#!/usr/bin/env python。但我认为以这种方式工作的代码量非常少。其中大部分是 Python 3 之前的遗产,包括仍然建议使用/usr/bin/env python的教程等,而没有警告后果。 -
fwiw,windows上python的默认安装不遵守pep394——它只提供
python.exe和pythonw.exe -
@Evert 当然,在我写完这篇文章之后,我才恍然大悟:) 我想我刚刚看到了一个例子,里面有一些
import __future__的东西,现在这很有意义。非常有效,如果您编写了兼容的代码,则无需关心。 -
这个问题是我不建议任何人学习 python 或将它用于任何事情的第一大原因。
-
这个问题很隐蔽,因为它最终出现在用户的机器上,并且没有令人满意的解决方案。别误会,我喜欢python3;但是我们需要解决人们和他们的机器认为所有python脚本都兼容所有解释器版本的问题。
标签: python environment-variables versioning