2010-09-21 13 views
7

Ho uno script Python che utilizza la versione di Python 2.6 sintassi (tranne errore come valore :) che la versione 2.5 si lamenta. Quindi nel mio script ho incluso del codice per verificare la versione dell'interprete Python prima di procedere in modo che l'utente non venga colpito da un brutto errore, tuttavia, indipendentemente da dove posizioni quel codice, non funziona. Quando raggiunge la strana sintassi, genera l'errore di sintassi, ignorando qualsiasi tentativo di controllo della versione.Controllo della versione di Python Interpreter al momento dell'esecuzione di script con sintassi non valida

So che potrei semplicemente effettuare un tentativo/eccetto il blocco sull'area in cui si verifica l'errore SyntaxError e generare il messaggio ma mi chiedo se esiste un modo più "elegante". Poiché non sono molto entusiasta di inserire try/except blocks in tutto il mio codice per risolvere il problema della versione. Ho esaminato l'utilizzo di un file __ init__.py, ma l'utente non sta importando/utilizzando il mio codice come pacchetto, quindi non penso che la route funzionerà, a meno che manchi qualcosa ...

qui è la mia versione codice di controllo:

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() 

risposta

7

Crea uno script wrapper che controlla la versione e chiama il tuo vero script - questo ti dà la possibilità di controllare la versione prima che l'interprete cerchi di verificare la sintassi dello script reale.

+0

Sì, questo ha fatto il trucco. Grazie! – Stunner

+1

Non è necessario? –

+2

Come è inutile? L'intero modulo viene verificato con la sintassi prima dell'esecuzione di una singola riga di codice, quindi non è possibile intercettare SyntaxError o eseguire controlli di versione prima che sia troppo tardi senza uno script di wrapper. – javawizard

3

in sys.version_info troverete le informazioni sulla versione memorizzata in una tupla:

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

Ora è possibile confrontare:

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

Grazie, ma ho già un metodo per controllare questo, mostrato sopra. – Stunner

+0

Questo non sarebbe affidabile, poiché la divisione si comporta in modo diverso tra 2 e 3, ad esempio 2.6 non sarebbe uguale a 2 + (6/10). 2 + (6/10) = 2.0 –

0

Se la velocità non è una priorità, è possibile evitare completamente questo problema utilizzando sys.exc_info per ottenere i dettagli dell'ultima eccezione.

7

Qualcosa di simile all'inizio del codice?

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

Usa qualcosa con questo, è ciò che esiste per sys.version_info. –

+3

Ho avuto un problema simile e ho anche provato questo approccio, ma, sfortunatamente, questo trucco non funziona nei casi in cui il codice utilizza la sintassi che non è compatibile con la versione di Python in esecuzione. Questo perché l'interprete controlla la sintassi del codice prima di compilarlo/eseguirlo. Quindi, l'istruzione "if ..." non verrà mai eseguita se, ad esempio, hai qualche istruzione altrove nel tuo codice che non è compatibile con la versione corrente di python (ad esempio, print (..., file = sys. stderr), dove la parola chiave 'file' non è compatibile con python più vecchio. – JJC

Problemi correlati