2010-09-21 9 views
7

I tienen una secuencia de comandos Python que utiliza la versión Python 2.6 sintaxis (Excepto error como valor :) la versión 2.5 se queja de. Por lo tanto, en mi secuencia de comandos he incluido un código para verificar la versión del intérprete de Python antes de continuar para que el usuario no reciba un error desagradable, sin embargo, no importa dónde coloque ese código, no funciona. Una vez que golpea la sintaxis extraña, arroja el error de sintaxis, sin tener en cuenta los intentos de comprobación de la versión.comprobación de versión de Python intérprete Tras la ejecución de escritura con el sintaxis no válida

Sé que podría simplemente colocar un bloque try/except sobre el área donde se produce SyntaxError y generar el mensaje allí, pero me pregunto si hay una forma más "elegante". Como no estoy muy interesado en colocar bloques try/except en todo mi código para abordar el problema de la versión. Intenté usar un archivo __ init__.py, pero el usuario no importará/usará mi código como un paquete, así que no creo que esa ruta funcione, a menos que me falta algo ...

aquí está mi versión del código de verificación:

import sys 
def isPythonVersion(version): 
    if float(sys.version[:3]) >= version: 
     return True 
    else: 
     return False 

if not isPythonVersion(2.6): 
    print "You are running Python version", sys.version[:3], ", version 2.6 or 2.7 is required. Please update. Aborting..." 
    exit() 

Respuesta

7

Cree un script de contenedor que verifique la versión y llame a su script real; esto le da la oportunidad de verificar la versión antes de que el intérprete intente verificar la sintaxis del script real.

+0

Sí, esto hizo el truco. ¡Gracias! – Stunner

+1

¿No es esto innecesario? –

+2

¿Cómo es innecesario? Todo el módulo es sintaxis comprobado antes de ejecutar una sola línea de código, por lo que no es posible detectar SyntaxError o realizar comprobaciones de versión antes de que sea demasiado tarde sin un script de envoltura. – javawizard

3

en sys.version_info se encuentra la información de la versión almacenada en una tupla:

sys.version_info 
(2, 6, 6, 'final', 0) 

Ahora usted puede comparar:

def isPythonVersion(version): 
    return version >= sys.version_info[0] + sys.version_info[1]/10. 
+0

Gracias pero ya tengo un método para verificar esto, como se muestra arriba. – Stunner

+0

Esto no sería confiable, ya que la división se comporta de manera diferente entre 2 y 3, por ejemplo 2.6 no sería igual a 2 + (6/10). 2 + (6/10) = 2.0 –

0

Si la velocidad no es una prioridad, puede evitar este problema completamente usando sys.exc_info para captar los detalles de la última excepción.

7

¿Algo como esto en el comienzo del código?

import sys 
if sys.version_info<(2,6): 
    raise SystemExit('Sorry, this code need Python 2.6 or higher') 
+0

Usa algo con esto, es para lo que sys.version_info existe. –

+3

Tuve un problema similar y también había intentado este enfoque, pero, desafortunadamente, este truco no funciona en los casos en que el código usa sintaxis que no es compatible con la versión de python en ejecución. Esto se debe a que el intérprete verifica la sintaxis de su código antes de compilarlo/ejecutarlo. Por lo tanto, la sentencia "si ..." nunca se ejecutará si, por ejemplo, tiene alguna declaración en algún lugar de su código que no sea compatible con la versión actual de python (por ej., Print (..., file = sys. stderr), donde la palabra clave 'archivo' no es compatible con python antiguo. – JJC

Cuestiones relacionadas