¿Cómo detecto la versión de Python en tiempo de ejecución?

Tengo un archivo de Python que podría tener que ser compatible con las versiones de Python = 3.x. ¿Hay alguna manera de realizar una introspección del tiempo de ejecución de Python para saber la versión que se está ejecutando (por ejemplo, 2.6 or 3.2.x )?

Claro, eche un vistazo a sys.version y sys.version_info .

Por ejemplo, para verificar que está ejecutando Python 3.x, use

 import sys if sys.version_info[0] < 3: raise Exception("Must be using Python 3") 

Aquí, sys.version_info[0] es el número de versión principal. sys.version_info[1] le daría el número de versión menor.

En Python 2.7 y sys.version_info posteriores, también se puede acceder a los componentes de sys.version_info por nombre, por lo que el número de versión principal es sys.version_info.major .

Vea también ¿Cómo puedo verificar la versión de Python en un progtwig que usa nuevas características de idioma?

Prueba este código, esto debería funcionar:

 import platform print(platform.python_version()) 

Por sys.hexversion y API y versiones ABI :

 import sys if sys.hexversion >= 0x3000000: print('Python 3.x hexversion %s is in use.' % hex(sys.hexversion)) 

La mejor solución depende de cuánto código es incompatible. Si hay muchos lugares en los que es necesario admitir Python 2 y 3, six es el módulo de compatibilidad. six.PY2 y six.PY3 son dos booleanos si quieres verificar la versión.

Sin embargo, una solución mejor que usar muchas declaraciones if es usar six funciones de compatibilidad si es posible. Hipotéticamente, si Python 3000 tiene una nueva syntax para el next , alguien podría actualizar six para que su código anterior aún funcione.

 import six #OK if six.PY2: x = it.next() # Python 2 syntax else: x = next(it) # Python 3 syntax #Better x = six.next(it) 

http://pythonhosted.org/six/

Aclamaciones

En caso de que quiera ver todos los detalles sangrientos en forma legible por humanos, puede usar:

 import platform; print(platform.sys.version); 

Salida para mi sistema:

 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) [GCC 7.2.0] 

Algo muy detallado, pero analizable por máquina, sería obtener el objeto version_info de platform.sys , y luego usar sus propiedades para tomar un curso de acción predeterminado. Por ejemplo:

 import platform; print(platform.sys.version_info) 

Salida en mi sistema:

 sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0) 

Aquí hay algunos códigos que uso con sys.version_info para verificar la instalación de Python:

 def checkInstallation(rv): currentVersion = sys.version_info if currentVersion[0] == rv[0] and currentVersion[1] >= rv[1]: pass else: sys.stderr.write( "[%s] - Error: Your Python interpreter must be %d.%d or greater (within major version %d)\n" % (sys.argv[0], rv[0], rv[1], rv[0]) ) sys.exit(-1) return 0 ... # Calling the 'checkInstallation' function checks if Python is >= 2.7 and < 3 requiredVersion = (2,7) checkInstallation( requiredVersion ) 

Para hacer que los scripts sean compatibles con Python2 y 3, uso:

 from sys import version_info if version_info[0] < 3: from __future__ import print_function 

Ya que todo lo que te interesa es si tienes Python 2 o 3, un poco pirateado pero definitivamente la forma más simple y 100% efectiva de hacerlo sería la siguiente: python python_version_major = 3/2*2 El único inconveniente de esto es que cuando hay Python 4, probablemente todavía le dará 3.

Ejemplo de verificación de versión a continuación.

Tenga en cuenta que no detengo la ejecución, este fragmento simplemente:
– No hacer nada si la versión exacta coincide.
– escriba INFO si la revisión (último número) es diferente
– escribe WARN si alguno de mayor + menor es diferente

 import sys import warnings def checkVersion(): # Checking Python version: expect_major = 2 expect_minor = 7 expect_rev = 14 if sys.version_info[:3] != (expect_major, expect_minor, expect_rev): print("INFO: Script developed and tested with Python " + str(expect_major) + "." + str(expect_minor) + "." + str(expect_rev)) current_version = str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2]) if sys.version_info[:2] != (expect_major, expect_minor): warnings.warn("Current Python version was unexpected: Python " + current_version) else: print(" Current version is different: Python " + current_version)