从python获取java版本号

jte*_*ert 4 python bash grep cut sed

我需要从python(或bash)获取java版本号,例如"1.5".

我会用:

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

但是返回1.5.0_30

如果数字变为"1.10",则需要兼容.

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

Pet*_*ood 13

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)
Run Code Online (Sandbox Code Playgroud)

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

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

>>> print re.search(pattern, version).groups()[0]
1.7
Run Code Online (Sandbox Code Playgroud)

如果您使用的是2.7之前的Python版本,请参阅此问题:subprocess.check_output()似乎不存在(Python 2.6.5)

  • 非常好!我从中学到了很多东西,比我对外部`awk`的呼唤更好. (2认同)

fed*_*qui 4

考虑这样的输出:

$ 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)
Run Code Online (Sandbox Code Playgroud)

awk您可以通过以下方式获取版本号:

$ java -version 2>&1 | awk -F[\"_] 'NR==1{print $2}'
1.8.0
Run Code Online (Sandbox Code Playgroud)

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

$ java -version 2>&1 | awk -F[\"\.] -v OFS=. 'NR==1{print $2,$3}'
1.8
Run Code Online (Sandbox Code Playgroud)

此处,awk将字段分隔符设置为 or "(_.),以便将该行分割成多个部分。然后,它打印第一行的第二个字段(由 指示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
Run Code Online (Sandbox Code Playgroud)