从python获取java版本号

时间:2015-08-04 11:18:21

标签: python bash sed grep cut

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

我会用:

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

但是返回1.5.0_30

如果数字变为“1.10”,则需要兼容。

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

6 个答案:

答案 0 :(得分:11)

Java运行时似乎将版本信息发送到stderr。您可以使用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

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

答案 1 :(得分:3)

考虑这样的输出:

$ 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 $2}'
1.8.0

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

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

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

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

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

答案 2 :(得分:1)

您无法使用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

答案 3 :(得分:1)

你可以让grep处理一个正则表达式:

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

答案 4 :(得分:0)

python

import os;

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

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

print xxx
1.8

答案 5 :(得分:0)

这是一个旧帖子,但是如果有人需要它:

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)