¿Cómo verifico qué versión de Python ejecuta mi script?

1186

¿Cómo puedo verificar qué versión de Python Interpreter está interpretando mi script?

portador
fuente
1
El hilo actual se trata de verificar la versión de Python desde un programa / script de Python. En caso de que desee 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
1
aquí hay una forma divertida de separar python 3 y 2 ...python_version = int(str(range(3))[-2])
Chris_Rands
@RBT: para una verificación de una línea desde la línea de comandos, vea mi respuesta .
smci

Respuestas:

1379

Esta información está disponible en la cadena sys.version en el módulo sys :

>>> 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 su posterior procesamiento:

>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192

Para garantizar que se ejecute un script 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 mayor y menor. Añadir micro (= 0, 1releaselevel, etc) e incluso (= 'alpha', 'final', etc) a la tupla como te gusta. Sin embargo, tenga en cuenta que casi siempre es mejor "agacharse" para verificar si existe cierta característica y, de lo contrario, solucionar el problema (o rescatarlo). A veces, las funciones desaparecen en versiones más recientes y son reemplazadas por otras.

krawyoti
fuente
39
en realidad es la sintaxis para imprimir. no para verificar la versión. Lo uso en mis scripts de Python 2 y 3:PY3 = sys.version_info[0] == 3
gcb
55
PY2 = sys.version_info [0] == 2 PY3 = sys.version_info [0] == 3
xiaoweiz
25
También puede acceder a algunos de los campos sys.version_infocomo propiedades, por lo que PY3 = sys.version_info.major == 3podría ser un poco más atractivo.
krs013
1
Nota: sys.hexversion se compara con 0x020502F0, consulte docs.python.org/2/library/sys.html#sys.hexversion
Yinon Ehrlich
1
@gcb su fragmento de código se romperá cada vez que ocurra Python 4. Usted debe hacer if sys.version_info >= (3,). Es totalmente pitónico comparar tuplas de diferentes tamaños y hará lo correcto.
Boris
374

Desde la línea de comando (observe la 'V' mayúscula):

python -V

Esto está documentado en 'man python'.

jcolino
fuente
13
capital V es versión, no minúscula
Rogue
96

Me gusta sys.hexversionpara cosas como esta.

http://docs.python.org/library/sys.html#sys.hexversion

>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
brianz
fuente
Esa es una característica ingeniosa de la versión que no había visto, y un poco más fácil de usar (al menos para mí) que la versión normal ...
Wayne Werner
66
@sorin: ¿puedes explicar cómo es esto mejor que, por ejemplo, la respuesta de Seth? Como usted dice que esto es lo mejor, me pregunto.
0xC0000022L
3
@ 0xC0000022L ¿Alguna vez te has preguntado cómo podrías comparar el texto de la tupla? ¿Cómo se compara 'final' con beta, rc o lo que sea que esté allí? En cambio, si tiene un valor numérico, siempre podrá especificar una versión exacta.
sorin
1
@sorin: uhm, eso no importa exactamente, ¿verdad? Si comparo con (2,6,4)el 'final'no parece afectar la comparación y no se supone que lo haga. Aparentemente no se necesita cortar en rodajas cuando comparo las partes "más significativas" de la tupla. Esto parece ser cómo se trata y de eso se trataba mi pregunta. No digo que esta solución no tenga mérito, solo me pregunto por qué es la mejor, es decir, qué me estoy perdiendo.
0xC0000022L
11
El nivel de lanzamiento se define como 'alfa', 'beta', 'candidato' o 'final', que también se compara correctamente ...
Fredrik
65

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 ajustar sus importaciones en un simple intento, que debería detectar errores de sintaxis. Y, para el 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!"
>>>
Seth
fuente
3
¿Por qué una excepción simple y no un error de importación? : P
mortal
44
@deadly: ImportError no detectará SyntaxErrors, que se generará si intentas usar una nueva sintaxis en un viejo python, como intentar usar el acceso directo condicional en pre-2.5.
Seth
except ExceptionEs muy amplio. ¿No sería mejor usar las excepciones específicas que esperas?
paradoja de Fermi
1
@Fermiparadox: ser amplio mantiene bajos los supuestos. La except Exception:línea por sí sola ya asume una pitón moderna (2.x +). ¿Quizás algún futuro Python reorganizará los nombres de excepción de alguna manera incompatible con versiones anteriores? (? Probablemente no, pero quién sabe lo pitón se verá en 20 años, cuando todos tenemos implantes fisura globo ocular Oculus Código dura mucho tiempo.)
Seth
65

Use platform'spython_version del stdlib:

>>> from platform import python_version
>>> print(python_version())
2.7.8
Cuenta
fuente
55
Para la función de impresión, sería mejor entre paréntesis, pensando en la compatibilidad. Si alguien usa la muestra en la versión 3, el error de sintaxis estará allí esperando.
Alex Chiang
47

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 tu 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 objetivo 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 un script que importe el script con el código más moderno.

rjmunro
fuente
66
Esto es incorrecto (o al menos, incompleto) porque los viejos intérpretes vomitarán sobre construcciones de lenguaje más nuevas como x if Pred() else y. Morirán durante la fase de "lexing", y nunca tendrán la oportunidad de ejecutarse realmente exit(1). La respuesta de Seth es correcta al encapsular las nuevas características del lenguaje en otros archivos.
Mark Rushakoff
2
@ MarkRushakoff: tu comentario es confuso. ¿Qué aspecto de esta respuesta está mal? ¿La elserama que falta o para la que <se usa version_info? AFAIK Python agrega valores perdidos en tuplas, y todo esto debería ser válido antes de 2.6, ¿no? Entonces, la respuesta de Seth usa el corte (redundantemente) mientras que este no lo hace y eso hace que su comentario sea aún más confuso.
0xC0000022L
55
Creo que lo que dice @MarkRushakoff es que si tiene esto en la parte superior de un archivo, y una nueva función de idioma en otro lugar del mismo archivo, la versión anterior de python morirá al cargar el archivo, antes de ejecutarlo, entonces el error no se mostrará. Básicamente, debe colocar lo anterior (u otra verificación) en la parte superior de un archivo, luego importar el código que requiere una nueva versión de python desde archivos separados.
rjmunro
1
Sí, lo que dijo @rjmunro :)
Mark Rushakoff
25

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 simplemente 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)
Wolph
fuente
1
@vigilancer tienes razón, al momento de escribir esto no era tan relevante todavía, pero lo actualicé para Python 3 ahora :)
Wolph
Bien, esto resuelve mi problema donde estaba obteniendo el número de versión capturando la salida de python2 --versiony python3 --versiondesde PHP. Mientras que tendría la última sin problemas a través de passthru(), el primero sólo imprimiría a la pantalla, pero nunca ser capturado, incluso cuando se redirige a un archivo ...
Tox
1
@tox Puede indicar print() que escriba en un archivo si es más conveniente.
Wolph
En mi caso, sería más de lo mismo, ya que estoy redirigiendo la passthru()salida a un archivo. Tu solución hace exactamente lo que necesito. :)
Tox
14

Con el sixmódulo, puedes hacerlo de la siguiente manera:

import six

if six.PY2:
  # this is python2.x
else:
  # six.PY3
  # this is python3.x
Dzhuang
fuente
8
import sys
sys.version.split(' ')[0]

sys.version te da lo que quieres, solo elige el primer número :)

fengshaun
fuente
5

La forma mas simple

Simplemente escriba python en su terminal y puede ver la versión de la siguiente manera

desktop:~$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
cjahangir
fuente
23
"La forma más simple" ... de hacer algo diferente a lo que se le pidió.
Luc
4

Como dijo Seth, el script principal podría verificar sys.version_info(pero tenga en cuenta que eso no apareció hasta 2.0, por lo que si desea admitir versiones anteriores, deberá verificar otra propiedad de versión del módulo sys).

Pero aún debe tener cuidado de no utilizar ninguna función del lenguaje Python en el archivo que no esté disponible en versiones anteriores de Python. Por ejemplo, esto está permitido en Python 2.5 y versiones posteriores:

try:
    pass
except:
    pass
finally:
    pass

pero no funcionará en versiones anteriores de Python, porque solo podría tener excepto O finalmente coincidir con el intento. Entonces, para la compatibilidad con versiones anteriores de Python, debe escribir:

try:
    try:
        pass
    except:
        pass
finally:
    pass
Heikki Toivonen
fuente
2

Varias respuestas ya sugieren cómo consultar la versión actual de Python. Para verificar mediante programación los requisitos de la versión, utilizaría uno de los dos métodos siguientes:

# Method 1: (see krawyoti's answer)
import sys
assert(sys.version_info >= (2,6))

# Method 2: 
import platform
from distutils.version import StrictVersion 
assert(StrictVersion(platform.python_version()) >= "2.6")
normanius
fuente
2

Solo por diversión, la siguiente es una forma de hacerlo en CPython 1.0-3.7b2, Pypy, Jython y Micropython. Esto es más una curiosidad que una forma de hacerlo en código moderno. Lo escribí como parte de http://stromberg.dnsalias.org/~strombrg/pythons/ , que es un script para probar un fragmento de código en muchas versiones de Python a la vez, para que pueda tener una idea de qué Python Las características son compatibles con las versiones de Python:

via_platform = 0
check_sys = 0
via_sys_version_info = 0
via_sys_version = 0
test_sys = 0
try:
    import platform
except (ImportError, NameError):
    # We have no platform module - try to get the info via the sys module
    check_sys = 1

if not check_sys:
    if hasattr(platform, "python_version"):
        via_platform = 1
    else:
        check_sys = 1

if check_sys:
    try:
        import sys
        test_sys = 1
    except (ImportError, NameError):
        # just let via_sys_version_info and via_sys_version remain False - we have no sys module
        pass

if test_sys:
    if hasattr(sys, "version_info"):
        via_sys_version_info = 1
    elif hasattr(sys, "version"):
        via_sys_version = 1
    else:
        # just let via_sys remain False
        pass

if via_platform:
    # This gives pretty good info, but is not available in older interpreters.  Also, micropython has a
    # platform module that does not really contain anything.
    print(platform.python_version())
elif via_sys_version_info:
    # This is compatible with some older interpreters, but does not give quite as much info.
    print("%s.%s.%s" % sys.version_info[:3])
elif via_sys_version:
    import string
    # This is compatible with some older interpreters, but does not give quite as much info.
    verbose_version = sys.version
    version_list = string.split(verbose_version)
    print(version_list[0])
else:
    print("unknown")
dstromberg
fuente
2

Verifique la versión de Python: python -Vo python --versionoapt-cache policy python

También puede ejecutar whereis pythonpara ver cuántas versiones están instaladas.

Shusen Yi
fuente
3
La misma respuesta ya fue publicada. y, La pregunta no es "¿Cómo verifico qué versión de Python he instalado?" pero "¿Cómo verifico la versión en mi script?".
Stanley Kou
2

Si desea detectar pre-Python 3 y no quiere importar nada ...

... puede (ab) usar cambios de alcance de comprensión de listas y hacerlo en una sola expresión :

is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)
usuario541686
fuente
2

Para verificar la versión de Python para comandos en Windows, ejecute los siguientes comandos en un símbolo del sistema y verifique la salida

c:\>python -V
Python 2.7.16

c:\>py -2 -V
Python 2.7.16

c:\>py -3 -V
Python 3.7.3

Además, para ver la configuración de la carpeta para cada versión de Python, ejecute los siguientes comandos:

For Python 2,'py -2 -m site'
For Python 3,'py -3 -m site'
Aamir M Meman
fuente
2
from sys import version_info, api_version, version, hexversion

print(f"sys.version: {version}")
print(f"sys.api_version: {api_version}")
print(f"sys.version_info: {version_info}")
print(f"sys.hexversion: {hexversion}")

salida

sys.version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
sys.api_version: 1013
sys.version_info: sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)
sys.hexversion: 50726384
oetzi
fuente
Para Python 2.7, debemos usar print("sys.version: {}".format(version)).
Marco
@Marco, a la derecha. el formato de cadena se realiza para v 3+ con argumentos de palabras clave. se puede hacer como print ('[{}, {}, {}]'. format (1,2,3)) para python 2.7 ref: stackoverflow.com/questions/517355/string-formatting-in-python
oetzi
1

sys.version_infono parece devolver un a tuplepartir de 3.7. Más bien, devuelve una clase especial, por lo que todos los ejemplos que usan tuplas no funcionan, al menos para mí. Aquí está el resultado de una consola python:

>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>

He descubierto que usar una combinación de sys.version_info.majory sys.version_info.minorparece ser suficiente. Por ejemplo,...

import sys
if sys.version_info.major > 3:
    print('Upgrade to Python 3')
    exit(1)

comprueba si estás ejecutando Python 3. Incluso puedes buscar versiones más específicas con ...

import sys
ver = sys.version_info
if ver.major > 2:
    if ver.major == 3 and ver.minor <= 4:
        print('Upgrade to Python 3.5')
        exit(1)

puede verificar si está ejecutando al menos Python 3.5.

Parker E.
fuente
Es algo así como una subclase de namedtupley compararlo con tuplas definitivamente funciona. Para obtener la igualdad total, necesita un tipo de cinco elementos: mayor, menor, micro, releaselevel (cadena) y serial.
Mikhail Edoshin
0

La forma aún más simple:

En Spyder, inicie una nueva "Consola IPython", luego ejecute cualquiera de sus scripts existentes.

Ahora la versión se puede ver en la primera salida impresa en la ventana de la consola:

"Python 3.7.3 (predeterminado, 24 de abril de 2019, 15:29:51) ..."

ingrese la descripción de la imagen aquí

S. Jessen
fuente
0

Para verificar desde la línea de comandos, en un solo comando, pero incluye mayor, menor, micro versión, releaselevel y serial :

> python -c "import sys; print('{}.{}.{}-{}-{}'.format(*sys.version_info))"

3.7.6-final-0

Nota: en .format()lugar de f-strings o le '.'.join()permite utilizar el formato arbitrario y los caracteres de separación, por ejemplo, para hacer de esta una cadena de una sola palabra greppable. Puse esto dentro de un script de utilidad bash que informa todas las versiones importantes: python, numpy, pandas, sklearn, MacOS, xcode, clang, brew, conda, anaconda, gcc / g ++ etc. Útil para el registro, la replicabilidad, la resolución de problemas, informes de errores, etc. .

smci
fuente
-1

Si está trabajando en Linux, simplemente dé la python salida del comando será así

Python 2.4.3 (# 1, 11 de junio de 2009, 14:09:37)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] en linux2

Escriba "ayuda", "derechos de autor", "créditos" o "licencia" para obtener más información.

pkm
fuente
55
Quiero que mi script de Python pueda obtener la versión de Python que lo está interpretando. La respuesta correcta ha sido aceptada.
transportista
El no ayuda a obtener la Pythonversión dentro del script, también una respuesta similar ya publicada anteriormente: stackoverflow.com/a/35294211/950762
Akif