¿Cómo verifico qué versión de Python está ejecutando mi script?

7 minutos de lectura

avatar de usuario
transportador

¿Cómo compruebo qué versión del intérprete de Python está ejecutando mi script?

  • 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

avatar de usuario
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, 1etc) 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, entonces PY3 = 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

avatar de usuario
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

avatar de usuario
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

avatar de usuario
Factura

Usar platform‘s python_version de la biblioteca estándar:

from platform import python_version
print(python_version())

# 3.9.2

avatar de usuario
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 y python3 --version de PHP. Si bien obtendría este último sin problemas a través de passthru()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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad