从 python 获取 java 版本号

Get java version number from python

我需要从 python(或 bash)获取 java 版本号,例如“1.5”。

我会使用:

os.system('java -version 2>&1 | grep "java version" | cut -d "\\"" -f 2')

但是 returns 1.5.0_30

例如数字变为“1.10”需要兼容

我想使用 cut 或 grep 甚至 sed。 它应该在一行中。

考虑这样的输出:

$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

你可以用awk得到版本号,像这样:

$ java -version 2>&1 | awk -F[\"_] 'NR==1{print }'
1.8.0

或者,如果您只想要前两个 . 分隔的数字:

$ java -version 2>&1 | awk -F[\"\.] -v OFS=. 'NR==1{print ,}'
1.8

此处,awk 将字段分隔符设置为 "_(或 .),以便将行分割成几段。然后,它在第一行打印第二个字段(由 NR==1 表示)。通过设置 OFS 我们指示什么是输出字段分隔符,所以说 print , 打印第二个字段,然后是第三个字段,中间有一个 .

要在 Python 中使用它,您需要正确转义:

>>> os.system('java -version 2>&1 | awk -F[\\"_] \'NR==1{print }\'')
1.8.0
>>> os.system('java -version 2>&1 | awk -F[\\"\.] -v OFS=. \'NR==1{print ,}\'')
1.8

Java 运行时似乎将版本信息发送到标准错误。您可以使用 Python 的 subprocess 模块:

>>> import subprocess
>>> version = subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT)

>>> print version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) Client VM (build 24.79-b02, mixed mode)

您可以使用正则表达式获取版本:

>>> import re
>>> pattern = '\"(\d+\.\d+).*\"'

>>> print re.search(pattern, version).groups()[0]
1.7

如果您使用的是 Python 的 pre-2.7 版本,请参阅此问题:subprocess.check_output() doesn't seem to exist (Python 2.6.5)

您无法使用 os.system() 捕获命令的输出。相反,使用 subprocess.check_output():

>>> import subprocess
>>> java_version = subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT)
>>> java_version
'openjdk version "1.8.0_51"\nOpenJDK Runtime Environment (build 1.8.0_51-b16)\nOpenJDK 64-Bit Server VM (build 25.51-b03, mixed mode)\n'

现在您可以收集命令输出,您可以使用 Python 提取版本号,而不是通过其他命令进行管道传输(顺便说一下,这需要使用安全性较低的 shell=True check_output).

的参数
>>> version_number = java_version.splitlines()[0].split()[-1].strip('"')
>>> major, minor, _ = version_number.split('.')
>>> print 'Major: {}, Minor: {}'.format(major, minor)
Major: 1, Minor: 8

您可以让 grep 处理正则表达式:

java -version 2>&1 | grep -Eow '[0-9]+\.[0-9]+' | head -1

python

import os;

os.system("java -version 2>&1 | grep 'version' 2>&1 | awk -F\\" '{ split(,a,\".\"); print a[1]\".\"a[2]}'");

xxx=os.popen("java -version 2>&1 | grep 'version' 2>&1 | awk -F\\" '{ split(,a,\".\"); print a[1]\".\"a[2]}'").read();

print xxx
1.8

这是一个旧的 post,但如果有人需要它:

import subprocess
import re

javaPath = 'C:/.../java.exe'

javaInfo = subprocess.check_output(javaPath + ' -version', shell=True, stderr=subprocess.STDOUT)
javaVersion = re.search(r'"[0-9\._]*"', javaInfo.decode().split("\r")[0]).group().replace('"', '')

print(javaVersion)