2010-09-21 16 views
7

Mam skrypt Pythona, który używa wersji Pythona 2.6 składni (z wyjątkiem błędu jak wartości :) która wersja 2.5 narzeka. Dlatego w swoim skrypcie zawarłem pewien kod, aby sprawdzić wersję interpretera Pythona przed kontynuowaniem, aby użytkownik nie został trafiony z nieprzyjemnym błędem, jednak nie ważne gdzie umieściłem ten kod, to nie działa. Gdy trafi na dziwną składnię, generuje błąd składni, pomijając wszelkie próby sprawdzenia wersji.Sprawdzanie wersji Pythona Interpreter po wykonaniu scenariusz z nieprawidłową składnię

Wiem, że mógłbym po prostu umieścić spróbuj/oprócz bloku nad obszarem, w którym występuje błąd SyntaxError i wygenerować komunikat, ale zastanawiam się, czy istnieje bardziej "elegancki" sposób. Ponieważ nie jestem bardzo zainteresowany umieszczaniem try/except bloków na całym moim kodzie, aby rozwiązać problem z wersją. Przyjrzałem się użyciu pliku __ init__.py, ale użytkownik nie będzie importować/używać mojego kodu jako pakietu, więc nie sądzę, że trasa będzie działać, chyba że czegoś brakuje ...

Oto moja wersja kodu sprawdzanie:

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

Odpowiedz

7

Utwórz skrypt otoki, który sprawdza wersję i wywołuje twój prawdziwy skrypt - to daje szansę sprawdzenia wersji zanim interpreter spróbuje sprawdzić składnię prawdziwego skryptu.

+0

Tak, to załatwiło sprawę. Dzięki! – Stunner

+1

Czy to nie jest konieczne? –

+2

Jak to jest niepotrzebne? Cały moduł jest sprawdzany składni przed uruchomieniem pojedynczej linii kodu, więc nie jest możliwe, aby złapać SyntaxError lub przeprowadzić kontrolę wersji, zanim będzie za późno, bez skryptu opakowania. – javawizard

3

w sys.version_info znajdziesz informacje o wersji przechowywanych w krotki:

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

teraz można porównać:

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

Dzięki, ale już mam metodę sprawdzania tego, pokazaną powyżej. – Stunner

+0

To nie byłoby wiarygodne, ponieważ podział zachowuje się inaczej między 2 a 3, Na przykład 2.6 nie będzie równe 2 + (6/10). 2 + (6/10) = 2.0 –

0

Jeśli prędkość nie jest priorytetem, można całkowicie uniknąć tego problemu, używając sys.exc_info, aby pobrać szczegóły ostatniego wyjątku.

7

Coś takiego na początku kodu?

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

Użyj czegoś z tym, to jest to, co istnieje dla sys.version_info. –

+3

Miałem podobny problem, a także próbował tego podejścia, ale, niestety, ta sztuczka nie działa w przypadkach, w których kod używa składni, która nie jest zgodna z wersją Pythona działa. Wynika to z faktu, że interpreter sprawdza składnię twojego kodu przed skompilowaniem/uruchomieniem go. Tak więc instrukcja "if ..." nigdy nie zostanie uruchomiona, jeśli, powiedzmy, masz jakieś instrukcje w innym miejscu kodu, które nie jest kompatybilne z aktualną wersją pythona (np. Print (..., file = sys. stderr), gdzie słowo kluczowe "file" nie jest kompatybilne ze starszym pythonem. – JJC

Powiązane problemy