当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在使用新语言功能的程序中检查Python版本?》经验,为你挑选了8个好方法。

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

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

例如,我有一个使用ternery操作符(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

(引导同事.)



1> orip..:

你可以测试使用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 *


这是一个很棒的答案.从需要解决的问题的主要问题是,程序必须在语法上对于该版本的python甚至开始执行才是正确的,因此使用新语法会阻止程序从旧版本的解释器开始.eval可以解决这个问题
如果通过setuptools安装软件包,则源文件的字节编译将失败.此外,产生运行时错误消息的所有扭曲看起来都有点无意义 - 为什么不只是记录需求并留下它?
请注意,如果尝试检查表达式而不是简单语句,则需要使用`exec`而不是`eval`.我尝试编写一个可以在py2k和py3k中打印到stderr的函数时出现了这个问题.
我认为这个解决方案的一个更简洁的版本是将你的"检查"放在一个单独的模块中并导入它(在try/except中包装`import`站).请注意,您可能还需要检查除"SyntaxError"之外的其他内容(例如,内置函数或标准库的附加内容)

2> Ed Carrel..:

有一个程序包装程序,执行以下操作.

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()如果您计划遇到使用2.0之前的Python解释器的人,您也可以考虑使用,但是您可以使用一些正则表达式.

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


仅供参考,"cur_version> = req_version"应该作为条件.
`sys.version_info`不是一个函数.
将代码置于成功的条件中是非常糟糕的做法,因为它是一个不必要的缩进和逻辑的添加.只需执行:if sys.version_info [:2]
3> James Anders..:

尝试

import platform
platform.python_version()

应该给你一个像"2.3.1"的字符串.如果这不是您想要的,那么通过"平台"内置提供了丰富的数据集.你想要的应该在某个地方.


-1:这不起作用,如更新的问题中所述.如果您使用较新版本的Python中的任何语法,那么您的文件将无法编译,如果它不编译,则无法运行并检查版本!

4> sorin..:

可能最好的方法做这个版本比较是使用sys.hexversion.这很重要,因为比较版本元组不会在所有python版本中提供所需的结果.

import sys
if sys.hexversion < 0x02060000:
    print "yep!"
else:
    print "oops!"


-1:这不起作用,如更新的问题中所述.如果您使用较新版本的Python中的任何语法,那么您的文件将无法编译,如果它不编译,则无法运行并检查版本!
你能解释在什么情况下比较版本元组不能给出理想的结果吗?

5> 小智..:
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")


请注意,在Python 2.6及更低版本中,`sys.version_info`不是**一个命名元组.你需要使用`sys.version_info [0]`作为主要版本号,并使用`sys.version_info [1]`作为未成年人.

6> Suriyaa..:

来自AskUbuntu的Nykakin的回答:

您还可以使用platform标准库中的模块从代码本身检查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:

截图2016-11-16 14.39.01 by Suriyaa Kudo


有用的资源

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



7> André..:

集合成为Python 2.4核心语言的一部分,以保持向后兼容.那时我做了这个,这对你也有用:

if sys.version_info < (2, 4):
    from sets import Set as set


最好检查功能而不是版本,不是吗?`try:set除了NameError:from sets import Set as set`

8> DevPlayer..:

虽然问题是: 如何及早获得控制权以发出错误消息并退出

我回答的问题是: 如何在启动应用程序之前及早获得控制权以发出错误消息

我能以与其他帖子不同的方式回答它.到目前为止,似乎答案是试图从Python中解决您的问题.

我说,在启动Python之前进行版本检查.我看到你的路径是Linux或unix.但是,我只能为您提供Windows脚本.我将图像调整为linux脚本语法并不会太难.

这是版本为2.7的DOS脚本:

@ECHO OFF
REM see http://ss64.com/nt/for_f.html
FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul
IF NOT ErrorLevel 1 GOTO Python27
ECHO must use python2.7 or greater
GOTO EOF
:Python27
python.exe tern.py
GOTO EOF
:EOF

这不会运行应用程序的任何部分,因此不会引发Python异常.它不会创建任何临时文件或添加任何OS环境变量.由于版本语法规则不同,它不会将您的应用程序结束为异常.这是三个不太可能的访问安全点.

FOR /F条线是关键.

FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul

对于多个python版本检查检查URL:http://www.fpschultze.de/modules/smartfaq/faq.php? faqid = 17

我的黑客版本:

[MS脚本; Python版本检查预发布的Python模块] http://pastebin.com/aAuJ91FQ

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有