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

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

For example, I have a program that uses the ternery operator (new in 2.5) and "with" blocks (new in 2.6). I wrote a simple little interpreter-version checker routine which is the first thing the script would call ... except it doesn't get that far. Instead, the script fails during python compilation, before my routines are even called. Thus the user of the script sees some very obscure synax error tracebacks - which pretty much require an expert to deduce that it is simply the case of running the wrong version of 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

(为同事通灵。)


当前回答

我只是在快速搜索后发现了这个问题,同时试图解决自己的问题,我已经提出了一个混合基于上面的一些建议。

我喜欢DevPlayer使用包装器脚本的想法,但缺点是你最终要为不同的操作系统维护多个包装器,所以我决定用python编写包装器,但使用相同的基本“通过运行exe获取版本”逻辑,并提出了这个想法。

我认为它应该适用于2.5版及以上版本。到目前为止,我已经在Linux的2.66、2.7.0和3.1.2以及OS X的2.6.1上测试了它。

import sys, subprocess
args = [sys.executable,"--version"]

output, error = subprocess.Popen(args ,stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()
print("The version is: '%s'"  %error.decode(sys.stdout.encoding).strip("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLMNBVCXZ,.+ \n") )

是的,我知道最终的解码/剥线是可怕的,但我只是想快速获取版本号。我要改进一下。

目前这对我来说已经足够好了,但如果有人能改进它(或者告诉我为什么这是一个糟糕的想法),那也很酷。

其他回答

import sys    
# prints whether python is version 3 or not
python_version = sys.version_info.major
if python_version == 3:
    print("is python 3")
else:
    print("not python 3")

Nykakin在AskUbuntu的回答:

您还可以使用标准库中的平台模块从代码本身检查Python版本。

有两个功能:

Platform.python_version()(返回字符串)。 Platform.python_version_tuple()(返回元组)。


Python代码

创建一个文件,例如:version.py)

检查版本的简便方法:

import platform

print(platform.python_version())
print(platform.python_version_tuple())

你也可以使用eval方法:

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

在命令行中运行Python文件:

$ python version.py 
2.7.11
('2', '7', '11')

在Windows 10上通过WAMP服务器输出带有CGI的Python:


有用的资源

https://askubuntu.com/questions/505081/what-version-of-python-do-i-have

为您的程序提供以下包装器。

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."

如果您打算遇到使用2.0以前版本的Python解释器的人,那么还可以考虑使用sys.version(),但随后需要处理一些正则表达式。

也许有更优雅的方法。

问题很简单。您检查了版本是否小于2.4,而不是小于或等于。因此,如果Python版本是2.4,则不小于2.4。 你应该拥有的是:

    if sys.version_info **<=** (2, 4):

,而不是

    if sys.version_info < (2, 4):

我只是在快速搜索后发现了这个问题,同时试图解决自己的问题,我已经提出了一个混合基于上面的一些建议。

我喜欢DevPlayer使用包装器脚本的想法,但缺点是你最终要为不同的操作系统维护多个包装器,所以我决定用python编写包装器,但使用相同的基本“通过运行exe获取版本”逻辑,并提出了这个想法。

我认为它应该适用于2.5版及以上版本。到目前为止,我已经在Linux的2.66、2.7.0和3.1.2以及OS X的2.6.1上测试了它。

import sys, subprocess
args = [sys.executable,"--version"]

output, error = subprocess.Popen(args ,stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()
print("The version is: '%s'"  %error.decode(sys.stdout.encoding).strip("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLMNBVCXZ,.+ \n") )

是的,我知道最终的解码/剥线是可怕的,但我只是想快速获取版本号。我要改进一下。

目前这对我来说已经足够好了,但如果有人能改进它(或者告诉我为什么这是一个糟糕的想法),那也很酷。