Get java version number from python

≯℡__Kan透↙ 提交于 2019-12-28 18:25:02

问题


I need to get the java version number, for example "1.5", from python (or bash).

I would use:

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

But that returns 1.5.0_30

It needs to be compatible if the number changes to "1.10" for example.

I would like to use cut or grep or even sed. It should be in one line.


回答1:


Considering an output like this:

$ 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)

You can get the version number with awk like this:

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

Or, if you just want the first two .-separated digits:

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

Here, awk sets the field separator to either " or _ (or .), so that the line is sliced in pieces. Then, it prints the 2nd field on the first line (indicated by NR==1). By setting OFS we indicate what is the output field separator, so that saying print $2, $3 prints the 2nd field followed by the 3rd one with a . in between.

To use it in Python you need to escape properly:

>>> 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:


The Java runtime seems to send the version information to the stderr. You can get at this using Python's subprocess module:

>>> 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)

You can get the version out with a regex:

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

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

If you are using a pre-2.7 version of Python, see this question: subprocess.check_output() doesn't seem to exist (Python 2.6.5)




回答3:


You could let grep handle a regular expression:

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



回答4:


You can't capture the command's output with os.system(). Instead, use 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'

Now that you can collect the command output, you can extract the version number using Python, rather than piping through other commands (which, incidentally, would require use of the less secure shell=True argument to 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


来源:https://stackoverflow.com/questions/31807882/get-java-version-number-from-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!