¿Cómo compruebo qué versión del intérprete de Python está ejecutando mi script?
¿Cómo verifico qué versión de Python está ejecutando mi script?
transportador
krawyoti
Esta información está disponible en el sys.version
cadena en el sys
módulo:
>>> import sys
Legible por humanos:
>>> print(sys.version) # parentheses necessary in python 3.
2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
Para un procesamiento posterior, utilice sys.version_info
o sys.hexversion
:
>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192
Para asegurarse de que un script se ejecute con un requisito de versión mínima del intérprete de Python, agregue esto a su código:
assert sys.version_info >= (2, 5)
Esto compara la información de la versión principal y secundaria. Añadir micro (=0
, 1
etc) e incluso nivel de versión (='alpha'
,'final'
, etc) a la tupla que quieras. Tenga en cuenta, sin embargo, que casi siempre es mejor “eludir” verificar si una característica determinada está ahí y, si no, solucionarlo (o rescatarlo). A veces, las funciones desaparecen en las versiones más recientes y se reemplazan por otras.
-
en realidad es la sintaxis para imprimir. no para comprobar la versión. Lo uso en mis scripts de Python 2 y 3:
PY3 = sys.version_info[0] == 3
– gcb
30 de julio de 2015 a las 8:47
-
PY2 = sys.version_info[0] == 2 PY3 = sys.version_info[0] == 3
– xiaoweiz
1 de enero de 2016 a las 5:02
-
También puede acceder a algunos de los campos en
sys.version_info
como propiedades, entoncesPY3 = sys.version_info.major == 3
podría ser un poco más atractivo.– krs013
13 dic 2016 a las 16:34
-
@gcb su fragmento de código se romperá cada vez que ocurra Python 4. Deberías hacer
if sys.version_info >= (3,)
. Es totalmente pitónico comparar tuplas de diferentes tamaños y hará lo correcto.– Boris Verjovskiy
2 de noviembre de 2019 a las 23:51
-
Si el archivo python se ejecuta con
-O
o-OO
, se eliminará la aserción. Por lo tanto, podría ser mejor hacer una verificación regular y salir del programa si no se cumple la condición.– xuiqzy
2 de octubre de 2020 a las 13:08
jcolino
Desde la línea de comando (tenga en cuenta la ‘V’ mayúscula):
python -V
Esto está documentado en ‘man python’.
Desde la consola de IPython
!python -V
-
@AxelBregnsbo Tenga en cuenta que
!python -V
puede devolver una versión diferente de Python que la que se está ejecutando actualmente.– Josías Yoder
26 de agosto de 2020 a las 12:23
-
Esto no es responder a la pregunta.
– transportador
1 de noviembre de 2021 a las 18:04
brianz
me gusta sys.hexversion
por cosas como esta.
>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
-
@0xC0000022L ¿Alguna vez se preguntó cómo podría comparar el texto de la tupla? ¿Cómo se compara ‘final’ con beta, rc o lo que sea que pueda estar allí? En cambio, si tiene un valor numérico, siempre podrá especificar una versión exacta.
– sorin
4 de junio de 2013 a las 10:52
-
@sorin: uhm, eso no importa exactamente, ¿verdad? Si comparo contra
(2,6,4)
la'final'
no parece afectar la comparación y no se supone que lo haga. Aparentemente, no se necesita cortar cuando comparo las partes “más significativas” de la tupla. Así parece ser cómo se trata y de eso se trataba mi pregunta. No digo que esta solución no tenga su mérito, solo me pregunto por qué es la mejor, es decir, lo que me estoy perdiendo.– 0xC0000022L
4 de junio de 2013 a las 10:57
-
Mientras no termines comparando
(3,3,0,'rc1','0')
y(3,3,0,'beta','0')
– sorin
5 de junio de 2013 a las 9:51
-
El nivel de lanzamiento se define como uno de ‘alfa’, ‘beta’, ‘candidato’ o ‘final’, que también se compara correctamente…
– Federico
22 de julio de 2013 a las 19:56
Factura
Usar platform
‘s python_version
de la biblioteca estándar:
from platform import python_version
print(python_version())
# 3.9.2
set
Su mejor apuesta es probablemente algo así:
>>> import sys
>>> sys.version_info
(2, 6, 4, 'final', 0)
>>> if not sys.version_info[:2] == (2, 6):
... print "Error, I need python 2.6"
... else:
... from my_module import twoPointSixCode
>>>
Además, siempre puede envolver sus importaciones en un simple intento, lo que debería detectar errores de sintaxis. Y, al punto de @Heikki, este código será compatible con versiones mucho más antiguas de python:
>>> try:
... from my_module import twoPointSixCode
... except Exception:
... print "can't import, probably because your python is too old!"
>>>
-
¿Por qué una excepción simple y no un error de importación? :PAGS
– mortal
15 de octubre de 2013 a las 9:54
-
@deadly: ImportError no detectará SyntaxErrors, que se generará si intenta usar una nueva sintaxis en un python antiguo, como intentar usar el atajo condicional en pre-2.5.
– set
22 de octubre de 2013 a las 5:24
-
except Exception
es demasiado amplio. ¿No sería mejor usar excepciones específicas que espera?– usuario
1 de febrero de 2016 a las 17:14
-
@Fermiparadox: ser amplio mantiene bajas las suposiciones. los
except Exception:
La línea por sí misma ya asume una pitón moderna (2.x+). ¿Quizás algún python futuro reorganizará los nombres de excepción de alguna manera incompatible con versiones anteriores? (Probablemente no, pero ¿quién sabe cómo se verá Python dentro de 20 años cuando todos tengamos implantes de globo ocular oculus rift? El código dura mucho tiempo).– set
1 de febrero de 2016 a las 21:27
Pon algo como:
#!/usr/bin/env/python
import sys
if sys.version_info<(2,6,0):
sys.stderr.write("You need python 2.6 or later to run this script\n")
exit(1)
en la parte superior de su guión.
Tenga en cuenta que dependiendo de qué más haya en su secuencia de comandos, es posible que las versiones anteriores de python que el destino ni siquiera puedan cargar la secuencia de comandos, por lo que no llegarán lo suficientemente lejos como para informar este error. Como solución alternativa, puede ejecutar lo anterior en una secuencia de comandos que importa la secuencia de comandos con el código más moderno.
-
¿Por qué una excepción simple y no un error de importación? :PAGS
– mortal
15 de octubre de 2013 a las 9:54
-
@deadly: ImportError no detectará SyntaxErrors, que se generará si intenta usar una nueva sintaxis en un python antiguo, como intentar usar el atajo condicional en pre-2.5.
– set
22 de octubre de 2013 a las 5:24
-
except Exception
es demasiado amplio. ¿No sería mejor usar excepciones específicas que espera?– usuario
1 de febrero de 2016 a las 17:14
-
@Fermiparadox: ser amplio mantiene bajas las suposiciones. los
except Exception:
La línea por sí misma ya asume una pitón moderna (2.x+). ¿Quizás algún python futuro reorganizará los nombres de excepción de alguna manera incompatible con versiones anteriores? (Probablemente no, pero ¿quién sabe cómo se verá Python dentro de 20 años cuando todos tengamos implantes de globo ocular oculus rift? El código dura mucho tiempo).– set
1 de febrero de 2016 a las 21:27
Aquí hay una versión corta de la línea de comandos que sale de inmediato (útil para scripts y ejecución automatizada):
python -c "print(__import__('sys').version)"
O solo el mayor, menor y micro:
python -c "print(__import__('sys').version_info[:1])" # (2,)
python -c "print(__import__('sys').version_info[:2])" # (2, 7)
python -c "print(__import__('sys').version_info[:3])" # (2, 7, 6)
-
Bien, esto resuelve mi problema donde obtenía el número de versión al capturar la salida de
python2 --version
ypython3 --version
de PHP. Si bien obtendría este último sin problemas a través depassthru()
el primero solo se imprimiría en la pantalla pero nunca se capturaría, incluso cuando se redirigiera a un archivo…– Tóxico
5 sep 2019 a las 18:17
-
@tox Se puede decir
print()
para escribir en un archivo si eso es más conveniente.– lobo
5 sep 2019 a las 22:08
-
En mi caso sería más de lo mismo ya que estoy redirigiendo el
passthru()
salida a un archivo. Su solución hace exactamente lo que necesito. 🙂– Tóxico
6 sep 2019 a las 8:33
-
Gracias. También en mi caso fue útil agregar afirmación para validar la versión con código de salida
python -c "assert __import__('sys').version_info[:2] >= (3, 6)"
– Alex Kosh
13 mayo 2021 a las 12:44
El hilo actual trata sobre verificar la versión de python desde un programa/script de python. En caso de que esté buscando verificar la versión del intérprete de python instalada en su máquina desde la línea de comandos, consulte la siguiente publicación: ¿Qué versión de Python tengo instalada?
– RBT
20 de julio de 2018 a las 5:09
aquí hay una forma divertida de separar python 3 y 2…
python_version = int(str(range(3))[-2])
– Chris_Rands
20 de junio de 2019 a las 12:33
@RBT: para una verificación de una línea desde la línea de comandos, vea mi respuesta.
– smci
24 mayo 2020 a las 22:01