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,Jul312008,17:28:52)[GCC 4.2.3(Ubuntu4.2.3-2ubuntu7)]
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.
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.
@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):
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)>>>ifnot 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...exceptException:...print"can't import, probably because your python is too old!">>>
¿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.)
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/pythonimport 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.
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):
@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.xelse:# six.PY3# this is python3.x
"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:passexcept:passfinally: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:
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 importStrictVersionassert(StrictVersion(platform.python_version())>="2.6")
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 =0try:import platform
except(ImportError,NameError):# We have no platform module - try to get the info via the sys module
check_sys =1ifnot check_sys:if hasattr(platform,"python_version"):
via_platform =1else:
check_sys =1if check_sys:try:import sys
test_sys =1except(ImportError,NameError):# just let via_sys_version_info and via_sys_version remain False - we have no sys modulepassif test_sys:if hasattr(sys,"version_info"):
via_sys_version_info =1elif hasattr(sys,"version"):
via_sys_version =1else:# just let via_sys remain Falsepassif 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")
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]]andNoneor x)(True)
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:
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) ..."
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. .
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
python_version = int(str(range(3))[-2])
Respuestas:
Esta información está disponible en la cadena sys.version en el módulo sys :
Legible por humanos:
Para su posterior procesamiento:
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:
Esto compara la información de la versión mayor y menor. Añadir micro (=
0
,1
releaselevel, 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.fuente
PY3 = sys.version_info[0] == 3
sys.version_info
como propiedades, por lo quePY3 = sys.version_info.major == 3
podría ser un poco más atractivo.if sys.version_info >= (3,)
. Es totalmente pitónico comparar tuplas de diferentes tamaños y hará lo correcto.Desde la línea de comando (observe la 'V' mayúscula):
Esto está documentado en 'man python'.
fuente
Me gusta
sys.hexversion
para cosas como esta.http://docs.python.org/library/sys.html#sys.hexversion
fuente
(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.Su mejor apuesta es probablemente algo así:
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:
fuente
except Exception
Es muy amplio. ¿No sería mejor usar las excepciones específicas que esperas?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.)Use
platform
'spython_version
del stdlib:fuente
Pon algo como:
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.
fuente
x if Pred() else y
. Morirán durante la fase de "lexing", y nunca tendrán la oportunidad de ejecutarse realmenteexit(1)
. La respuesta de Seth es correcta al encapsular las nuevas características del lenguaje en otros archivos.else
rama que falta o para la que<
se usaversion_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.Aquí hay una versión corta de la línea de comandos que sale de inmediato (útil para scripts y ejecución automatizada):
O simplemente el mayor, menor y micro:
fuente
python2 --version
ypython3 --version
desde PHP. Mientras que tendría la última sin problemas a través depassthru()
, el primero sólo imprimiría a la pantalla, pero nunca ser capturado, incluso cuando se redirige a un archivo ...print()
que escriba en un archivo si es más conveniente.passthru()
salida a un archivo. Tu solución hace exactamente lo que necesito. :)Con el
six
módulo, puedes hacerlo de la siguiente manera:fuente
sys.version te da lo que quieres, solo elige el primer número :)
fuente
La forma mas simple
Simplemente escriba python en su terminal y puede ver la versión de la siguiente manera
fuente
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:
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:
fuente
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:
fuente
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:
fuente
Verifique la versión de Python:
python -V
opython --version
oapt-cache policy python
También puede ejecutar
whereis python
para ver cuántas versiones están instaladas.fuente
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 :
fuente
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
Además, para ver la configuración de la carpeta para cada versión de Python, ejecute los siguientes comandos:
fuente
salida
fuente
print("sys.version: {}".format(version))
.sys.version_info
no parece devolver un atuple
partir 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:He descubierto que usar una combinación de
sys.version_info.major
ysys.version_info.minor
parece ser suficiente. Por ejemplo,...comprueba si estás ejecutando Python 3. Incluso puedes buscar versiones más específicas con ...
puede verificar si está ejecutando al menos Python 3.5.
fuente
namedtuple
y compararlo con tuplas definitivamente funciona. Para obtener la igualdad total, necesita un tipo de cinco elementos: mayor, menor, micro, releaselevel (cadena) y serial.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) ..."
fuente
Para verificar desde la línea de comandos, en un solo comando, pero incluye mayor, menor, micro versión, releaselevel y serial :
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. .fuente
Si está trabajando en Linux, simplemente dé la
python
salida del comando será asífuente
Python
versión dentro del script, también una respuesta similar ya publicada anteriormente: stackoverflow.com/a/35294211/950762