with tutorial framework español djangoproject desde con cero applications python bash sed grep cut

python - framework - tutorial django



Obtenga el número de versión de java de python (4)

El tiempo de ejecución de Java parece enviar la información de la versión al stderr. Puede obtener esto utilizando el módulo de subprocess de Python:

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

Puede obtener la versión con una expresión regular:

>>> import re >>> pattern = ''/"(/d+/./d+).*/"'' >>> print re.search(pattern, version).groups()[0] 1.7

Si está utilizando una versión anterior a la versión 2.7 de Python, consulte esta pregunta: subprocess.check_output () no parece existir (Python 2.6.5)

Necesito obtener el número de versión de Java, por ejemplo "1.5", de python (o bash).

Yo usaría:

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

Pero eso regresa 1.5.0_30

Debe ser compatible si el número cambia a "1.10", por ejemplo.

Me gustaría usar cut o grep o incluso sed. Debería estar en una línea.


No puede capturar la salida del comando con os.system() . En su lugar, 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''

Ahora que puede recopilar el resultado del comando, puede extraer el número de versión usando Python, en lugar de canalizarlo a través de otros comandos (que, dicho sea de paso, requeriría el uso del argumento shell=True menos seguro para 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


Podrías dejar que grep maneje una expresión regular:

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


Teniendo en cuenta un resultado como este:

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

Puede obtener el número de versión con awk como este:

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

O, si solo quieres los dos primeros . -dígitos separados

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

Aquí, awk establece el separador de campo en " o _ (o . ), Para que la línea se corte en pedazos. Luego, imprime el segundo campo en la primera línea (indicado por NR==1 ). Al configurar OFS , indique cuál es el separador del campo de salida, de manera que al decir print $2, $3 imprime el 2. ° campo seguido por el 3. ° con un . entre ellos.

Para usarlo en Python, necesitas escapar correctamente:

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