我需要从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。 它应该在一行中。
答案 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)