2012-06-30 16 views
29

Ho un grande pezzo di codice Python 2 solo. Vuole controllare Python 3 all'inizio e uscire se viene usato python3. Così ho provato:python 2 code: se python 3 then sys.exit()

import sys 

if sys.version_info >= (3,0): 
    print("Sorry, requires Python 2.x, not Python 3.x") 
    sys.exit(1) 

print "Here comes a lot of pure Python 2.x stuff ..." 
### a lot of python2 code, not just print statements follows 

Tuttavia, l'uscita non avviene. L'output è:

$ python3 testing.py 
    File "testing.py", line 8 
     print "Here comes a lot of pure Python 2.x stuff ..." 
                 ^
SyntaxError: invalid syntax 

Così, sembra che i controlli pitone tutta codice prima di eseguire qualsiasi cosa, e quindi l'errore.

C'è un modo carino per il codice python2 per verificare l'utilizzo di python3, e in tal caso stampare qualcosa di amichevole e quindi uscire?

risposta

51

Python esegue il byte-compilazione del file sorgente prima di iniziare a eseguirlo. L'intero file deve almeno parsing correttamente, altrimenti si otterrà un SyntaxError.

La soluzione più semplice per il tuo problema è scrivere un piccolo wrapper che analizzi entrambi, Python 2.xe 3.x. Esempio:

import sys 
if sys.version_info >= (3, 0): 
    sys.stdout.write("Sorry, requires Python 2.x, not Python 3.x\n") 
    sys.exit(1) 

import the_real_thing 
if __name__ == "__main__": 
    the_real_thing.main() 

L'istruzione import the_real_thing verrà eseguita solo dopo l'istruzione if, in modo che il codice in questo modulo non è necessario analizzare come codice Python 3.x.

+0

Si potrebbe anche usare un blocco "if __name__ ==" foo "', che funziona come un 'if __name__ ==" __main __ "' ma viene eseguito quando 'foo' viene importato – inspectorG4dget

+2

Non sarebbe considerato più * Pythonic * usare EAFP e mettere l'importazione di the_real_thing all'interno di un blocco 'try'? – martineau

+1

@martineau: non lo farei nel caso in esame. L'importazione potrebbe benissimo avere successo e potrebbero verificarsi altri errori in 'main()'. Non vuoi includere 'the_real_thing.main() ' in try/except. –