2012-06-30 13 views
29

Mam duży fragment kodu tylko Python 2. Aby sprawdzić Python 3 na początku i wyjść, jeśli użyto python3. Tak więc próbowałem:kod Pythona 2: jeśli python 3 to 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 

Jednak wyjście nie nastąpi. Wyjście jest:

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

Tak, wygląda na to, kontroli Pythona z cały kod przed wykonaniem czegokolwiek, a więc o błędzie.

Czy istnieje dobry sposób sprawdzenia, czy python3 jest używany, a jeśli tak, wydrukuj coś przyjaznego, a następnie zakończ?

Odpowiedz

51

Python skompiluje plik źródłowy przed jego wykonaniem. Cały plik musi co najmniej parsować poprawnie, w przeciwnym razie otrzymasz numer SyntaxError.

Najprostszym rozwiązaniem problemu jest napisanie małego opakowania, które parsuje zarówno jako Python 2.x, jak i 3.x. Przykład:

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

Oświadczenie import the_real_thing będą realizowane wyłącznie ponastępującą adnotacją if, więc kod w tym module nie jest zobowiązany do analizowania, jak Python kodu 3.x.

+0

Można również użyć bloku 'if __name__ ==" foo "', który działa jak 'if __name__ ==" __main __ "', ale jest wykonywany, gdy 'foo' jest importowany – inspectorG4dget

+2

Czy nie byłoby to uważane za bardziej * Pythonic * aby korzystać z EAFP i po prostu umieścić import obiektu the_real_thing w bloku 'try'? – martineau

+1

@martineau: Nie zrobiłbym tego w tej sprawie. "Import" może bardzo dobrze się powieść, a inne błędy mogą się zdarzyć w 'main()'. Nie chcesz załączać 'the_real_thing.main() ' w try/except. –

Powiązane problemy