Получить номер версии Java С Python



Мне нужно получить номер версии java, например "1.5", из python (или bash).



Я бы использовал:



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


Но это возвращает 1.5.0_30



Он должен быть совместим, если число изменяется на "1,10", например.



Я хотел бы использовать cut или grep или даже sed.
Она должна быть в одной строке.

715   4  

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)

Вы можете получить номер версии с помощью 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 задает разделитель полей либо ", либо _ (или .), так что строка разрезается на части. Затем он печатает 2-е поле в первой строке (обозначается NR==1). Установив OFS, мы указываем, что является разделителем выходного поля, так что высказывание print $2, $3 выводит 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

Среда выполнения Java, похоже, отправляет информацию о версии в stderr. Вы можете добраться до этого с помощью Python'S 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, смотрите этот вопрос: подпроцесс.check_output (), похоже, не существует (Python 2.6.5)

Вы можете позволить grep обрабатывать регулярное выражение:

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'
Теперь, когда вы можете собрать выходные данные команды, вы можете извлечь номер версии с помощью 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

Comments

    Ничего не найдено.