Получить номер версии 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.
Она должна быть в одной строке.
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():Теперь, когда вы можете собрать выходные данные команды, вы можете извлечь номер версии с помощью Python, а не передавать по конвейеру через другие команды (что, кстати, потребует использования менее безопасного аргумента>>> 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
Comments