我需要从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。它应该在一行中完成。
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
awk
调用要好。 - fedorquicheck_call
替换check_output
时,子进程才能正常工作。我已经安装了Python 2.6。 - jteichertJAVA_TOOL_OPTIONS
环境变量,那么 Java 会在实际结果之前打印出选项,这可能会破坏您后面的正则表达式。 - Fabich$ 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
将打印第二个字段,后跟一个 .
,再后面是第三个字段。>>> 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
os.system()
捕获子进程的输出,因此这种方法比其他方法不太实用。 - mhawkeos.system()
和 Awk。subprocess
的答案应该被接受。 - tripleee
java -version 2>&1 | grep -Eow '[0-9]+\.[0-9]+' | head -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'
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
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)
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
os.system
运行终端命令,我认为“clean”已经过时了... - jonrsharpebld(features = 'javac jar', compat = '1.5', ... )
- jteichert