在使用无效语法执行脚本时检查Python解释器的版本

Stu*_*ner 13 python interpreter

我有一个Python脚本使用Python版本2.6语法(错误 :),版本2.5抱怨.因此,在我的脚本中,我已经包含了一些代码来检查Python解释器版本,然后继续进行,以便用户不会遇到令人讨厌的错误,但是,无论我放置代码在哪里,它都不起作用.一旦它遇到奇怪的语法,就会抛出语法错误,忽略我的版本检查的任何尝试.

我知道我可以简单地在发生SyntaxError的区域放置一个try/except块并在那里生成消息,但我想知道是否有更"优雅"的方式.因为我不太热衷于在我的代码中放置try/except块来解决版本问题.我查看了使用__ init__.py文件,但是用户不会将我的代码作为包导入/使用,所以我不认为该路由会起作用,除非我遗漏了一些东西......

这是我的版本检查代码:

import sys
def isPythonVersion(version):
    if float(sys.version[:3]) >= version:
        return True
    else:
        return False

if not isPythonVersion(2.6):
    print "You are running Python version", sys.version[:3], ", version 2.6 or 2.7 is required. Please update. Aborting..."
    exit()
Run Code Online (Sandbox Code Playgroud)

Ton*_*nen 14

在代码开头这样的东西?

import sys
if sys.version_info<(2,6):
    raise SystemExit('Sorry, this code need Python 2.6 or higher')
Run Code Online (Sandbox Code Playgroud)

  • 我有一个类似的问题,并尝试过这种方法,但不幸的是,这个技巧不适用于代码使用与python运行版本不兼容的语法的情况.这是因为解释器在编译/运行代码之前会检查代码的语法.因此,如果你的代码中的某些语句与当前版本的python不兼容(例如,print(...,file = sys)),那么"if ..."语句将永远不会运行. stderr),'file'关键字与旧python不兼容. (5认同)

bst*_*rre 13

创建一个包装器脚本来检查版本并调用您的真实脚本 - 这使您有机会在解释器尝试语法检查真实脚本之前检查版本.

  • 怎么没必要?在运行单行代码之前,对整个模块进行了语法检查,因此在没有包装器脚本的情况下为时已晚,无法捕获SyntaxError或执行版本检查. (2认同)

eum*_*iro 9

sys.version_info您将找到存储在元组中的版本信息:

sys.version_info
(2, 6, 6, 'final', 0)
Run Code Online (Sandbox Code Playgroud)

现在你可以比较:

def isPythonVersion(version):
    return version >= sys.version_info[0] + sys.version_info[1] / 10.
Run Code Online (Sandbox Code Playgroud)