如何检查运行我的脚本的 Python 版本?
Posted
技术标签:
【中文标题】如何检查运行我的脚本的 Python 版本?【英文标题】:How do I check what version of Python is running my script? 【发布时间】:2011-03-02 06:20:09 【问题描述】:如何检查 Python 解释器的版本正在解释我的脚本?
【问题讨论】:
当前线程是关于从 python 程序/脚本检查 python 版本。如果您想从命令行检查机器上安装的 python 解释器的版本,请参阅以下帖子 - Which version of Python do I have installed? 这里有一个有趣的方法来分离 python 3 和 2...python_version = int(str(range(3))[-2])
@RBT:从命令行进行单行检查,请参阅my answer。
@Chris_Rands 非常聪明。但是当他们推出 Python 4 时将无法正常工作。
【参考方案1】:
此信息可在sys
模块中的sys.version
字符串中找到:
>>> import sys
人类可读:
>>> print(sys.version) # parentheses necessary in python 3.
2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
如需进一步处理,请使用sys.version_info
或sys.hexversion
:
>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192
为确保脚本以最低版本要求的 Python 解释器运行,请将以下内容添加到您的代码中:
assert sys.version_info >= (2, 5)
这比较主要和次要版本信息。根据需要将 micro(=0
、1
等)甚至 releaselevel(='alpha'
、'final'
等)添加到元组中。但是请注意,“躲避”检查某个功能是否存在几乎总是更好,如果没有,解决方法(或纾困)。有时功能会在新版本中消失,被其他功能取代。
【讨论】:
它实际上是打印的语法。不是为了检查版本。我在我的 python 2 和 3 脚本中使用它:PY3 = sys.version_info[0] == 3
PY2 = sys.version_info[0] == 2 PY3 = sys.version_info[0] == 3
您还可以访问sys.version_info
中的一些字段作为属性,所以PY3 = sys.version_info.major == 3
可能更有吸引力。
@gcb 你的代码 sn-p 将在 Python 4 发生时中断。你应该做if sys.version_info >= (3,)
。比较不同大小的元组完全是pythonic,它会做正确的事情。
如果 python 文件使用-O
或-OO
运行,断言将被删除。因此,如果条件不满足,最好进行常规 if 检查并退出程序。【参考方案2】:
从命令行(注意大写“V”):
python -V
这在“man python”中有记录。
从 IPython 控制台
!python -V
【讨论】:
@AxelBregnsbo 请注意,!python -V
可能返回与当前运行的 Python 版本不同的版本。
这不是在回答问题。【参考方案3】:
我喜欢 sys.hexversion
这样的东西。
>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
【讨论】:
这是更多软件应该采用的做法。 @0xC0000022L 您有没有想过如何比较元组中的文本? 'final' 与 beta、rc 或任何可能存在的东西相比如何。相反,如果您有一个数值,您将始终能够指定一个准确的版本。 @sorin:嗯,这并不重要,不是吗?如果我与(2,6,4)
比较,'final'
似乎不会影响比较,也不应该影响比较。当我比较元组的“最重要”部分时,显然不需要切片。这似乎是它的处理方式,这就是我的问题所在。我并不是说这个解决方案没有它的优点,我只是想知道为什么它是最好的——即我所缺少的。
只要你不比较(3,3,0,'rc1','0')
和(3,3,0,'beta','0')
发布级别被定义为“alpha”、“beta”、“candidate”或“final”之一,这也恰好可以正确比较...【参考方案4】:
使用标准库中的platform
's python_version
:
from platform import python_version
print(python_version())
# 3.9.2
【讨论】:
【参考方案5】:你最好的选择可能是这样的:
>>> import sys
>>> sys.version_info
(2, 6, 4, 'final', 0)
>>> if not sys.version_info[:2] == (2, 6):
... print "Error, I need python 2.6"
... else:
... from my_module import twoPointSixCode
>>>
此外,您始终可以将导入包装在一个简单的尝试中,这应该可以捕获语法错误。而且,就@Heikki 而言,这段代码将与更旧版本的python 兼容:
>>> try:
... from my_module import twoPointSixCode
... except Exception:
... print "can't import, probably because your python is too old!"
>>>
【讨论】:
为什么是普通异常而不是 ImportError? :P @deadly - ImportError 不会捕获 SyntaxErrors,如果您尝试在旧 python 中使用新语法,例如尝试在 pre-2.5 中使用 shortcut conditional,则会抛出该错误。except Exception
太宽泛了。使用您期望的特定异常不是更好吗?
@Fermiparadox - 广泛保持假设低。 except Exception:
行本身已经假定为现代 (2.x+) python。也许某些未来的 python 会以某种向后不兼容的方式重新排列异常名称? (可能不会,但是谁知道 20 年后我们都植入了 oculus rift 眼球植入物,python 会是什么样子?代码可以持续很长时间。)【参考方案6】:
输入类似:
#!/usr/bin/env/python
import sys
if sys.version_info<(2,6,0):
sys.stderr.write("You need python 2.6 or later to run this script\n")
exit(1)
在脚本的顶部。
请注意,根据脚本中的其他内容,比目标版本更旧的 python 版本可能甚至无法加载脚本,因此无法报告此错误。作为一种解决方法,您可以在一个脚本中运行上述代码,该脚本使用更现代的代码导入脚本。
【讨论】:
这是不正确的(或者至少是不完整的),因为旧的解释器会讨厌新的语言结构,例如x if Pred() else y
。他们将在“词法分析”阶段死亡,并且永远没有机会真正执行 exit(1)
。 Seth's answer 将新语言特性封装在其他文件中是正确的。
@MarkRushakoff:您的评论令人困惑。这个答案的哪个方面是错误的?缺少else
分支或<
用于version_info
? AFAIK Python 填充元组中的缺失值,所有这些都应该在 2.6 之前有效,不是吗?所以赛斯的答案使用切片(冗余)而这个没有,这让你的评论更加混乱。
我认为@MarkRushakoff 的意思是,如果你在文件的顶部有这个,并且在同一个文件的其他地方有一个新的语言特性,那么旧版本的python 会在加载文件时死掉, 在它运行之前,所以不会显示错误。基本上你必须把上面的(或另一个检查)放在文件的顶部,然后从单独的文件中导入需要新版本 python 的代码。【参考方案7】:
这是一个简短的命令行版本,可以立即退出(方便脚本和自动执行):
python -c "print(__import__('sys').version)"
或者只是主要的、次要的和微观的:
python -c "print(__import__('sys').version_info[:1])" # (2,)
python -c "print(__import__('sys').version_info[:2])" # (2, 7)
python -c "print(__import__('sys').version_info[:3])" # (2, 7, 6)
【讨论】:
很好,这解决了我通过从 php 捕获python2 --version
和 python3 --version
的输出来获取版本号的问题。虽然我可以通过passthru()
毫无问题地获得后者,但前者只会打印到屏幕但永远不会被捕获,即使重定向到文件中也是如此......
@tox 你可以告诉print()
写入文件,如果这样更方便的话。
在我的情况下,这与我已经将passthru()
输出重定向到文件更相似。您的解决方案正是我所需要的。 :)
谢谢。同样在我的情况下,添加断言以使用退出代码 python -c "assert __import__('sys').version_info[:2] >= (3, 6)"
验证版本很有用【参考方案8】:
使用six
模块,您可以这样做:
import six
if six.PY2:
# this is python2.x
else:
# six.PY3
# this is python3.x
【讨论】:
【参考方案9】:import sys
sys.version.split(' ')[0]
sys.version 为您提供您想要的,只需选择第一个数字 :)
【讨论】:
【参考方案10】:就像 Seth 说的,主脚本可以检查 sys.version_info
(但请注意,直到 2.0 才出现,所以如果你想支持旧版本,你需要检查 sys 模块的另一个版本属性)。
但您仍然需要注意不要在文件中使用旧 Python 版本中不可用的任何 Python 语言功能。例如,这在 Python 2.5 及更高版本中是允许的:
try:
pass
except:
pass
finally:
pass
但不适用于较旧的 Python 版本,因为您只能使用 except OR finally 匹配 try。因此,为了与旧 Python 版本兼容,您需要编写:
try:
try:
pass
except:
pass
finally:
pass
【讨论】:
【参考方案11】:几个答案已经建议如何查询当前的python版本。要以编程方式检查版本要求,我会使用以下两种方法之一:
# Method 1: (see krawyoti's answer)
import sys
assert(sys.version_info >= (2,6))
# Method 2:
import platform
from distutils.version import StrictVersion
assert(StrictVersion(platform.python_version()) >= "2.6")
【讨论】:
【参考方案12】:最简单的方法
只需在终端中输入 python 即可查看版本 就像下面
desktop:~$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
【讨论】:
“最简单的方法” ...做一些与要求不同的事情。 那么在脚本中进行系统调用以查看“默认”是什么?这将有助于展示你将如何嵌入它。【参考方案13】:只是为了好玩,以下是在 CPython 1.0-3.7b2、Pypy、Jython 和 Micropython 上执行此操作的一种方式。这更像是一种好奇心,而不是现代代码中的一种方式。我将它作为http://stromberg.dnsalias.org/~strombrg/pythons/ 的一部分编写的,这是一个用于同时在多个python 版本上测试sn-p 代码的脚本,因此您可以轻松了解哪些python 功能与哪些版本的python 兼容:
via_platform = 0
check_sys = 0
via_sys_version_info = 0
via_sys_version = 0
test_sys = 0
try:
import platform
except (ImportError, NameError):
# We have no platform module - try to get the info via the sys module
check_sys = 1
if not check_sys:
if hasattr(platform, "python_version"):
via_platform = 1
else:
check_sys = 1
if check_sys:
try:
import sys
test_sys = 1
except (ImportError, NameError):
# just let via_sys_version_info and via_sys_version remain False - we have no sys module
pass
if test_sys:
if hasattr(sys, "version_info"):
via_sys_version_info = 1
elif hasattr(sys, "version"):
via_sys_version = 1
else:
# just let via_sys remain False
pass
if via_platform:
# This gives pretty good info, but is not available in older interpreters. Also, micropython has a
# platform module that does not really contain anything.
print(platform.python_version())
elif via_sys_version_info:
# This is compatible with some older interpreters, but does not give quite as much info.
print("%s.%s.%s" % sys.version_info[:3])
elif via_sys_version:
import string
# This is compatible with some older interpreters, but does not give quite as much info.
verbose_version = sys.version
version_list = string.split(verbose_version)
print(version_list[0])
else:
print("unknown")
【讨论】:
【参考方案14】:如果你想检测 pre-Python 3 并且不想导入任何东西......
...您可以(ab)使用列表理解范围更改并在单个表达式中进行:
is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)
【讨论】:
【参考方案15】:from sys import version_info, api_version, version, hexversion
print(f"sys.version: version")
print(f"sys.api_version: api_version")
print(f"sys.version_info: version_info")
print(f"sys.hexversion: hexversion")
输出
sys.version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] sys.api_version: 1013 sys.version_info: sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0) sys.hexversion: 50726384
【讨论】:
对于 Python 2.7,我们必须使用print("sys.version: ".format(version))
。
@Marco,对。使用关键字参数为 v 3+ 完成字符串格式化。可以作为 python 2.7 的 print('[,,]'.format(1,2,3)) 参考:***.com/questions/517355/string-formatting-in-python【参考方案16】:
检查 Python 版本:python -V
或 python --version
或 apt-cache policy python
您也可以运行whereis python
来查看安装了多少个版本。
【讨论】:
已经发布了相同的答案。而且,问题不是“如何检查我安装的 python 版本?”但是“如何检查我的脚本中的版本”。【参考方案17】:sys.version_info
从 3.7 开始似乎没有返回 tuple
。相反,它返回一个特殊的类,因此所有使用元组的示例都不起作用,至少对我来说。这是 python 控制台的输出:
>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>
我发现使用sys.version_info.major
和sys.version_info.minor
的组合似乎就足够了。比如……
import sys
if sys.version_info.major > 3:
print('Upgrade to Python 3')
exit(1)
检查您是否正在运行 Python 3。您甚至可以使用...检查更具体的版本
import sys
ver = sys.version_info
if ver.major > 2:
if ver.major == 3 and ver.minor <= 4:
print('Upgrade to Python 3.5')
exit(1)
可以检查您是否至少在运行 Python 3.5。
【讨论】:
它类似于namedtuple
的子类,并且将其与元组进行比较肯定有效。要获得完全相等,您需要一个五元素类型:major、minor、micro、releaselevel(字符串)和 serial。【参考方案18】:
要在 Windows 上验证命令的 Python 版本,请在命令提示符下运行以下命令并验证输出
c:\>python -V
Python 2.7.16
c:\>py -2 -V
Python 2.7.16
c:\>py -3 -V
Python 3.7.3
另外,要查看每个 Python 版本的文件夹配置,请运行以下命令:
For Python 2,'py -2 -m site'
For Python 3,'py -3 -m site'
【讨论】:
【参考方案19】:更简单最简单的方法:
在 Spyder 中,启动一个新的“IPython 控制台”,然后运行您现有的任何脚本。
现在可以在控制台窗口打印的第一个输出中看到版本:
“Python 3.7.3(默认,2019 年 4 月 24 日,15:29:51)...”
【讨论】:
【参考方案20】:从命令行检查,在一个命令中,但包括主要版本、次要版本、微版本、版本级别和序列号,然后调用与您相同的 Python 解释器(即相同的路径)'重新用于您的脚本:
> path/to/your/python -c "import sys; print('..--'.format(*sys.version_info))"
3.7.6-final-0
注意:.format()
代替 f 字符串或 '.'.join()
允许您使用任意格式和分隔符,例如使它成为一个 greppable 的单字字符串。我把它放在一个 bash 实用程序脚本中,该脚本报告所有重要版本:python、numpy、pandas、sklearn、MacOS、xcode、clang、brew、conda、anaconda、gcc/g++ 等。对于日志记录、可复制性、故障排除、错误报告等很有用.
【讨论】:
此答案适用于不同的问题,例如问题下方 cmets 中的 linked。它不适用于确定哪个 Python 版本正在从该脚本中执行该脚本,因为不能保证python
命令调用该特定 Python 解释器。
@user2357112supportsMonica:这个答案非常适合上述问题。无处说明的问题是“从脚本内部”。如果是这样,那就不一样了。显然,这个答案意味着“调用相同的 Python 解释器,即与您用于脚本的路径相同”。但是,如果您坚持我必须将其编辑到答案中,我会的。
f-strings 也可以使用任意格式。另外,我认为初学者很可能会在他们的 ide 中使用另一个 python 版本,而不是在命令行中键入 python 时使用的版本,他们可能没有意识到这种差异。【参考方案21】:
对于 Windows,转到命令提示符并键入此命令以获取 python 版本:
python --version
或者
python -V
【讨论】:
【参考方案22】:如果你在 linux 上工作,只需给命令python
输出将是这样的
Python 2.4.3(#1,2009 年 6 月 11 日,14:09:37)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] 在 linux2 上
输入“帮助”、“版权”、“信用”或“许可”以了解更多信息 信息。
【讨论】:
我希望我的 python 脚本能够获得解释它的 python 版本。正确答案已被接受。 在脚本中获取Python
版本并没有帮助,之前已经发布过类似的答案:***.com/a/35294211/950762【参考方案23】:
从 CMD 输入 py --version 然后按回车键,你会看到python安装的版本是这样的 Python 3.10.0
【讨论】:
【参考方案24】:尝试使用os.popen
在变量中读取它:
import os
ver = os.popen('python -V').read().strip()
print(ver)
【讨论】:
以上是关于如何检查运行我的脚本的 Python 版本?的主要内容,如果未能解决你的问题,请参考以下文章
当另一个 python 脚本正在运行时,如何停止我的 python 脚本?