如何在使用新语言功能的程序中检查 Python 版本?

新手上路,请多包涵

如果我有一个至少需要特定版本 Python 的 Python 脚本,那么当使用早期版本的 Python 启动脚本时,正确的失败方法是什么?

我如何尽早获得控制权以发出错误消息并退出?

例如,我有一个程序使用三元运算符(2.5 中的新功能)和“with”块(2.6 中的新功能)。我写了一个简单的小解释器版本检查器例程,这是脚本将调用的第一件事……除了它没有那么远。相反,脚本在 python 编译期间失败,甚至在我的例程被调用之前。因此脚本的用户会看到一些非常模糊的 synax 错误回溯——这几乎需要专家来推断这只是运行错误版本的 Python 的情况。

我知道如何检查 Python 的版本。问题是某些语法在旧版本的 Python 中是非法的。考虑这个程序:

 import sys
if sys.version_info < (2, 4):
    raise "must use python 2.5 or greater"
else:
    # syntax error in 2.4, ok in 2.5
    x = 1 if True else 2
    print x

在2.4下运行时,我想要这个结果

$ ~/bin/python2.4 tern.py
must use python 2.5 or greater

而不是这个结果:

 $ ~/bin/python2.4 tern.py
  File "tern.py", line 5
    x = 1 if True else 2
           ^
SyntaxError: invalid syntax

(为同事通灵。)

原文由 Mark Harrison 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 260
2 个回答

您可以使用 eval 进行测试:

 try:
  eval("1 if True else 2")
except SyntaxError:
  # doesn't have ternary

此外, with 在 Python 2.5 可用,只需添加 from __future__ import with_statement

编辑:为了尽早获得控制权,您可以将其拆分为不同的 .py 文件并在导入之前检查主文件中的兼容性(例如在 __init__.py 中的一个包中):

 # __init__.py

# Check compatibility
try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

# import from another module
from impl import *

原文由 orip 发布,翻译遵循 CC BY-SA 3.0 许可协议

在您的程序周围有一个包装器来执行以下操作。

 import sys

req_version = (2,5)
cur_version = sys.version_info

if cur_version >= req_version:
   import myApp
   myApp.run()
else:
   print "Your Python interpreter is too old. Please consider upgrading."

您还可以考虑使用 sys.version() ,如果您打算遇到使用 pre-2.0 Python 解释器的人,但您有一些正则表达式要做。

并且可能有更优雅的方法来做到这一点。

原文由 Ed Carrel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题