2017-07-12 87 views
2

我经常看到这个在.py文件顶部:任何不显式使用/ usr/bin/env python2/python3的理由?

#!/usr/bin/env python 

随着OS默认的未知状态,我不知道为什么它不是:

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

如果大多数操作系统提供这种版本的符号链接,那会更好吗?

我发现PEP 394而环顾四周,其中规定,目前,开发商应该假设python -> python2 -> python2.x。它指出,可以假定存在版本化的等价物,python3python2。那么不是会带来什么危害,并提供额外的特性?

如果一个人没有安装python2因为OS船舶默认使用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并根据需要显式调用了python3python3

  • This 2013 question:也许意味着python3不应该使用,因为不是所有的发行版都附带它?

是否有一个明显的原因,我(或python程序员)不应使用版本env呼叫如果大多数操作系统提供的呢?仅仅使用python似乎迎合了那些没有版本控制的少数派,同时也给绝大多数人造成混乱。

也许答案使用版本化的命令(我从PEP 394得到的),但没有足够的时间看到它们出现。到目前为止,我从来没有见过版本号为env的电话...然后,如果它有效,我永远不会看。如果它打破了,它总是一个无版本python行,所以我的心理计数可能是倾斜的!


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

  • #!/usr/bin/env python2:〜210K的Python文件中的代码打
  • #!/usr/bin/env python3:〜460K
  • #!/usr/bin/env python:〜600万

这可能意味着,大多数代码是足够大如果上述问题的建议是普遍的智慧,那么人们还没有更新他们的文件?


我看着这些流行的操作系统,并发现他们都使用版本控制命令:

+1

如果你的代码与Python2/3兼容,你可以使用'#!/ usr/bin/env python'。但我认为这是一个非常少量的代码。它大部分是来自Python 3之前的遗产,包括仍然建议使用'/ usr/bin/env python'的教程等,而没有警告后果。 – Evert

+1

fwiw,在Windows **上python的默认安装不符合pep394--它只是提供了'python.exe'和'pythonw.exe' –

+0

@Evert当然,在我写这个之后,我明白了:)我想我刚刚看到一个例子,用一些'import __future__'的东西,现在有道理。非常有效的是,如果你写了兼容的代码,你不需要关心。 – Hendy

回答

0

命令,你可能诱发Python的特定版本的各种依赖。使用词典理解?你至少需要Python 2.7。使用async关键字?你至少需要Python 3.5。

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

相反,用户应设置在他们系统的家当来的Python的正确版本的路径。

distutils包在这里是一个很好的折衷。您,开发人员,只需在脚本中输入#!python即可。当您通过python setup.py install安装脚本时,安装程​​序将用目标机器上正确的任何路径替换#!python

+0

我有点得到这个...但是“我的系统”也是安装​​在其上的所有软件的聚集体。所以,假设我想在'python3'中编写代码,我的操作系统(arch)假定'python == python3',并且我从某人那里安装软件([像这样](https://github.com/gepd/Deviot/issues/64))为v2.7编写的。哪个是我的系统的“正确”版本? – Hendy

+0

另外,如果开发者在他/她的代码中有一个'print'blah''的实例,那么他们*已经*指定了shebang(隐式地)。我的部分问题是间接询问为什么目前写入/更新的软件不承认这一点(这让我想知道是否有更深层次的原因,“因为历史是用'python2'编写的,这就是我们一直以来的做法”) 。 – Hendy

+1

不是用户; * installer *应该设置hash-bang(安装程序是否为包管理器,管理员或最终用户无关紧要)。 – Evert

相关问题