Bieżący wątek dotyczy sprawdzania wersji języka Python z programu / skryptu języka Python. Jeśli chcesz sprawdzić wersję interpretera Pythona zainstalowanego na twoim komputerze z wiersza poleceń, zapoznaj się z następującym postem - Którą wersję Pythona zainstalowałem?
RBT,
1
tutaj jest fajny sposób na oddzielenie python 3 i 2 ...python_version = int(str(range(3))[-2])
Chris_Rands
@RBT: dla kontroli jednego wiersza z wiersza poleceń, zobacz moją odpowiedź .
smci
Odpowiedzi:
1377
Ta informacja jest dostępna w ciągu sys.version w module sys :
>>>import sys
Czytelny dla człowieka:
>>>print(sys.version)# parentheses necessary in python 3. 2.5.2(r252:60911,Jul312008,17:28:52)[GCC 4.2.3(Ubuntu4.2.3-2ubuntu7)]
Aby mieć pewność, że skrypt działa przy minimalnej wymaganej wersji interpretera Pythona, dodaj to do swojego kodu:
assert sys.version_info >=(2,5)
Porównuje główne i drobne informacje o wersji. Dodaj mikro (= 0, 1itp), a nawet releaselevel (= 'alpha', 'final'itp) na krotki jak chcesz. Zauważ jednak, że prawie zawsze lepiej jest „uchylić się”, aby sprawdzić, czy jest tam jakaś funkcja, a jeśli nie, obejście (lub ratowanie). Czasami funkcje znikają w nowszych wersjach, zastępowane przez inne.
Możesz również uzyskać dostęp do niektórych pól sys.version_infojako właściwości, więc PY3 = sys.version_info.major == 3może być trochę bardziej atrakcyjna.
@ gcb fragment kodu ulegnie awarii za każdym razem, gdy wydarzy się Python 4. Powinieneś to zrobić if sys.version_info >= (3,). Porównywanie krotek o różnych rozmiarach jest całkowicie pytoniczne i zrobi to dobrze.
Boris
374
Z wiersza poleceń (zwróć uwagę na wielką literę „V”):
To fajna funkcja wersji, której nie widziałem, i nieco łatwiejsza w użyciu (przynajmniej dla mnie) niż zwykła wersja ...
Wayne Werner
6
@sorin: czy możesz wyjaśnić, jak to jest lepsze niż na przykład odpowiedź Setha? Skoro twierdzisz, że to jest najlepsze, zastanawiam się.
0xC0000022L
3
@ 0xC0000022L Czy zastanawiałeś się kiedyś, jak możesz porównać tekst z krotki? Jak „ostateczny” wypada w porównaniu z wersją beta, rc lub czymkolwiek innym. Zamiast tego, jeśli masz wartość liczbową, zawsze będziesz w stanie określić dokładną wersję.
sorin
1
@sorin: uhm, to nie ma znaczenia, prawda? Jeśli porównam z , wydaje się, (2,6,4)że 'final'nie ma to wpływu na porównanie i nie powinno tak być. Najwyraźniej nie trzeba kroić, gdy porównuję „najbardziej znaczące” części krotki. Wydaje się, że tak to jest traktowane i na tym właśnie polegało moje pytanie. Nie twierdzę, że to rozwiązanie nie ma swoich zalet, po prostu zastanawiam się, dlaczego jest najlepsze - czyli tego, czego mi brakuje.
0xC0000022L
11
Poziom wydania jest zdefiniowany jako jeden z „alfa”, „beta”, „kandydat” lub „ostateczny”, który również może być poprawnie porównywany ...
Fredrik
65
Twój najlepszy zakład to prawdopodobnie coś takiego:
>>>import sys
>>> sys.version_info
(2,6,4,'final',0)>>>ifnot sys.version_info[:2]==(2,6):...print"Error, I need python 2.6"...else:...from my_module import twoPointSixCode
>>>
Ponadto zawsze możesz zawinąć importowane elementy w prostą próbę, która powinna wyłapać błędy składniowe. I, do rzeczy @ Heikki, ten kod będzie kompatybilny ze znacznie starszymi wersjami Pythona:
>>>try:...from my_module import twoPointSixCode
...exceptException:...print"can't import, probably because your python is too old!">>>
@deadly - ImportError nie wyłapuje błędów składni, które zostaną wyrzucone, jeśli spróbujesz użyć nowej składni w starym pythonie, na przykład próbując użyć skrótu warunkowego w wersjach wcześniejszych niż 2.5.
Seth
except Exceptionjest zbyt szeroki. Czy nie byłoby lepiej zastosować określone wyjątki, których się spodziewasz?
Paradoks Fermiego
1
@Fermiparadox - Bycie szerokim utrzymuje założenia na niskim poziomie. except Exception:Linia sama już zakłada nowoczesną (2.x +) python. Może jakiś przyszły python zmieni kolejność nazw wyjątków w sposób niezgodny z poprzednimi wersjami? (Prawdopodobnie nie, ale kto wie, jak będzie wyglądał pyton za 20 lat, kiedy wszyscy będziemy mieli implanty oczne oczodołu? Kod trwa długo.)
W przypadku funkcji drukowania lepiej byłoby w nawiasach, jeśli chodzi o zgodność. Jeśli ktoś użyje próbki w wersji 3, czeka na nią błąd składniowy.
Alex Chiang
47
Umieść coś takiego:
#!/usr/bin/env/pythonimport sys
if sys.version_info<(2,6,0):
sys.stderr.write("You need python 2.6 or later to run this script\n")
exit(1)
u góry skryptu.
Zauważ, że w zależności od tego, co jeszcze jest w twoim skrypcie, starsze wersje Pythona niż cel mogą nie być w stanie nawet załadować skryptu, więc nie dostaną się wystarczająco daleko, aby zgłosić ten błąd. Aby obejść ten problem, możesz uruchomić powyższy skrypt w skrypcie, który importuje skrypt z bardziej nowoczesnym kodem.
Jest to niepoprawne (a przynajmniej niekompletne), ponieważ starzy tłumacze będą obrzucać się nowszymi konstrukcjami językowymi, takimi jak x if Pred() else y. Zginą podczas fazy leksykalnej i nigdy nie będą mieli szansy na wykonanieexit(1) . Odpowiedź Setha jest poprawna w przypadku enkapsulacji nowych funkcji językowych w innych plikach.
Mark Rushakoff,
2
@MarkRushakoff: twój komentarz jest mylący. Który aspekt tej odpowiedzi jest zły? Brakująca elsegałąź lub do której <jest używana version_info? Python AFAIK uzupełnia brakujące wartości w krotkach, a wszystko to powinno być ważne przed 2.6, nie? Tak więc odpowiedź Setha wykorzystuje krojenie (zbędne), podczas gdy ta nie, a to sprawia, że twój komentarz jest jeszcze bardziej mylący.
0xC0000022L
5
Myślę, że @ MarkRushakoff mówi, że jeśli masz to na górze pliku, a nowa funkcja języka w innym miejscu tego samego pliku, stara wersja Pythona umrze podczas ładowania pliku, zanim uruchomi którykolwiek z nich, więc błąd nie będzie wyświetlany. Zasadniczo musisz umieścić powyższe (lub inne sprawdzenie) na górze pliku, a następnie zaimportować kod, który wymaga nowej wersji Pythona z oddzielnych plików.
rjmunro
1
Tak, co powiedział @rjmunro :)
Mark Rushakoff
25
Oto krótka wersja wiersza poleceń, która natychmiast się kończy (przydatna w przypadku skryptów i automatycznego wykonywania):
@vigilancer masz rację, w chwili pisania tego jeszcze nie było to tak istotne, ale zaktualizowałem go teraz do Python 3 :)
Wolph
Ładne, to rozwiązuje mój problem gdzie byłem coraz numer wersji poprzez przechwytywanie wyjścia python2 --versioni python3 --versionod PHP. Podczas gdy ja dostawałbym ten drugi bez problemów passthru(), pierwszy drukowałby tylko na ekranie, ale nigdy nie został przechwycony, nawet po przekierowaniu do pliku ...
Tox
1
@tox Możesz powiedzieć, print() aby zapisać do pliku, jeśli jest to wygodniejsze.
Wolph
W moim przypadku byłoby to mniej więcej takie samo, jak już przekierowuję dane passthru()wyjściowe do pliku. Twoje rozwiązanie spełnia dokładnie to, czego potrzebuję. :)
Tox
14
Za pomocą sixmodułu możesz to zrobić poprzez:
import six
if six.PY2:# this is python2.xelse:# six.PY3# this is python3.x
„Najprostszy sposób” ... zrobić coś innego niż to, o co został poproszony.
Luc
4
Jak powiedział Seth, skrypt główny mógłby sprawdzić sys.version_info(ale zauważ, że pojawił się dopiero w wersji 2.0, więc jeśli chcesz obsługiwać starsze wersje, musisz sprawdzić właściwość innej wersji modułu sys).
Ale nadal musisz uważać, aby w pliku nie używać żadnych funkcji języka Python, które nie są dostępne w starszych wersjach języka Python. Na przykład jest to dozwolone w Pythonie 2.5 i nowszych:
try:passexcept:passfinally:pass
ale nie będzie działać w starszych wersjach Pythona, ponieważ możesz mieć tylko OR w końcu dopasować próbę. Aby zachować zgodność ze starszymi wersjami języka Python, musisz napisać:
Kilka odpowiedzi już sugeruje, jak wykonać zapytanie do bieżącej wersji Pythona. Aby programowo sprawdzić wymagania dotyczące wersji, skorzystałbym z jednej z dwóch poniższych metod:
# Method 1: (see krawyoti's answer)import sys
assert(sys.version_info >=(2,6))# Method 2: import platform
from distutils.version importStrictVersionassert(StrictVersion(platform.python_version())>="2.6")
Dla zabawy poniżej opisano sposób na CPython 1.0-3.7b2, Pypy, Jython i Micropython. Jest to bardziej ciekawość niż sposób robienia tego we współczesnym kodzie. Napisałem go jako część http://stromberg.dnsalias.org/~strombrg/pythons/ , który jest skryptem do testowania fragmentu kodu na wielu wersjach Pythona jednocześnie, dzięki czemu można łatwo sprawdzić, który python funkcje są kompatybilne z wersjami Pythona:
via_platform =0
check_sys =0
via_sys_version_info =0
via_sys_version =0
test_sys =0try:import platform
except(ImportError,NameError):# We have no platform module - try to get the info via the sys module
check_sys =1ifnot check_sys:if hasattr(platform,"python_version"):
via_platform =1else:
check_sys =1if check_sys:try:import sys
test_sys =1except(ImportError,NameError):# just let via_sys_version_info and via_sys_version remain False - we have no sys modulepassif test_sys:if hasattr(sys,"version_info"):
via_sys_version_info =1elif hasattr(sys,"version"):
via_sys_version =1else:# just let via_sys remain Falsepassif via_platform:# This gives pretty good info, but is not available in older interpreters. Also, micropython has a# platform module that does not really contain anything.print(platform.python_version())elif via_sys_version_info:# This is compatible with some older interpreters, but does not give quite as much info.print("%s.%s.%s"% sys.version_info[:3])elif via_sys_version:import string
# This is compatible with some older interpreters, but does not give quite as much info.
verbose_version = sys.version
version_list = string.split(verbose_version)print(version_list[0])else:print("unknown")
Ta sama odpowiedź została już opublikowana. i pytanie nie brzmi „Jak sprawdzić, którą wersję Pythona zainstalowałem?” ale „Jak sprawdzić wersję w moim skrypcie”.
Stanley Kou,
2
Jeśli chcesz wykryć wersję wcześniejszą niż Python 3 i nie chcesz niczego importować ...
... możesz (ab) użyć zakresu określania zakresu listy i zrobić to w jednym wyrażeniu :
is_python_3_or_above =(lambda x:[x for x in[False]]andNoneor x)(True)
sys.version_infonie wydaje się zwracać tupleod 3,7. Zwraca raczej specjalną klasę, więc wszystkie przykłady z użyciem krotek nie działają, przynajmniej dla mnie. Oto dane wyjściowe z konsoli python:
To coś w rodzaju podklasy namedtuplei porównanie z krotką zdecydowanie działa. Aby uzyskać pełną równość, potrzebujesz pięcioelementowego pisma: major, minor, micro, releaselevel (string) i serial.
Michaił Edoshin
0
Jeszcze prostszy i najprostszy sposób:
W Spyder uruchom nową „konsolę IPython”, a następnie uruchom dowolny z istniejących skryptów.
Teraz wersję można zobaczyć na pierwszym wydruku wydrukowanym w oknie konsoli:
„Python 3.7.3 (domyślnie, 24 kwietnia 2019 r., 15:29:51) ...”
Uwaga: .format()zamiast f-stringów lub '.'.join()pozwala na użycie dowolnych znaków formatowania i separatorów, np. Aby uczynić to ciągiem wyrazów jednoznacznych. Umieszczam to w skrypcie narzędzia bash, który zgłasza wszystkie ważne wersje: python, numpy, pandy, sklearn, MacOS, xcode, clang, brew, conda, anaconda, gcc / g ++ itp. Przydatny do logowania, replikacji, rozwiązywania problemów itp. Zgłaszania błędów itp. .
python_version = int(str(range(3))[-2])
Odpowiedzi:
Ta informacja jest dostępna w ciągu sys.version w module sys :
Czytelny dla człowieka:
Do dalszego przetwarzania:
Aby mieć pewność, że skrypt działa przy minimalnej wymaganej wersji interpretera Pythona, dodaj to do swojego kodu:
Porównuje główne i drobne informacje o wersji. Dodaj mikro (=
0
,1
itp), a nawet releaselevel (='alpha'
,'final'
itp) na krotki jak chcesz. Zauważ jednak, że prawie zawsze lepiej jest „uchylić się”, aby sprawdzić, czy jest tam jakaś funkcja, a jeśli nie, obejście (lub ratowanie). Czasami funkcje znikają w nowszych wersjach, zastępowane przez inne.źródło
PY3 = sys.version_info[0] == 3
sys.version_info
jako właściwości, więcPY3 = sys.version_info.major == 3
może być trochę bardziej atrakcyjna.if sys.version_info >= (3,)
. Porównywanie krotek o różnych rozmiarach jest całkowicie pytoniczne i zrobi to dobrze.Z wiersza poleceń (zwróć uwagę na wielką literę „V”):
Jest to udokumentowane w „man python”.
źródło
Lubię takie
sys.hexversion
rzeczy.http://docs.python.org/library/sys.html#sys.hexversion
źródło
(2,6,4)
że'final'
nie ma to wpływu na porównanie i nie powinno tak być. Najwyraźniej nie trzeba kroić, gdy porównuję „najbardziej znaczące” części krotki. Wydaje się, że tak to jest traktowane i na tym właśnie polegało moje pytanie. Nie twierdzę, że to rozwiązanie nie ma swoich zalet, po prostu zastanawiam się, dlaczego jest najlepsze - czyli tego, czego mi brakuje.Twój najlepszy zakład to prawdopodobnie coś takiego:
Ponadto zawsze możesz zawinąć importowane elementy w prostą próbę, która powinna wyłapać błędy składniowe. I, do rzeczy @ Heikki, ten kod będzie kompatybilny ze znacznie starszymi wersjami Pythona:
źródło
except Exception
jest zbyt szeroki. Czy nie byłoby lepiej zastosować określone wyjątki, których się spodziewasz?except Exception:
Linia sama już zakłada nowoczesną (2.x +) python. Może jakiś przyszły python zmieni kolejność nazw wyjątków w sposób niezgodny z poprzednimi wersjami? (Prawdopodobnie nie, ale kto wie, jak będzie wyglądał pyton za 20 lat, kiedy wszyscy będziemy mieli implanty oczne oczodołu? Kod trwa długo.)Stosowanie
platform
„spython_version
od stdlib:źródło
Umieść coś takiego:
u góry skryptu.
Zauważ, że w zależności od tego, co jeszcze jest w twoim skrypcie, starsze wersje Pythona niż cel mogą nie być w stanie nawet załadować skryptu, więc nie dostaną się wystarczająco daleko, aby zgłosić ten błąd. Aby obejść ten problem, możesz uruchomić powyższy skrypt w skrypcie, który importuje skrypt z bardziej nowoczesnym kodem.
źródło
x if Pred() else y
. Zginą podczas fazy leksykalnej i nigdy nie będą mieli szansy na wykonanieexit(1)
. Odpowiedź Setha jest poprawna w przypadku enkapsulacji nowych funkcji językowych w innych plikach.else
gałąź lub do której<
jest używanaversion_info
? Python AFAIK uzupełnia brakujące wartości w krotkach, a wszystko to powinno być ważne przed 2.6, nie? Tak więc odpowiedź Setha wykorzystuje krojenie (zbędne), podczas gdy ta nie, a to sprawia, że twój komentarz jest jeszcze bardziej mylący.Oto krótka wersja wiersza poleceń, która natychmiast się kończy (przydatna w przypadku skryptów i automatycznego wykonywania):
Lub tylko główne, drobne i mikro:
źródło
python2 --version
ipython3 --version
od PHP. Podczas gdy ja dostawałbym ten drugi bez problemówpassthru()
, pierwszy drukowałby tylko na ekranie, ale nigdy nie został przechwycony, nawet po przekierowaniu do pliku ...print()
aby zapisać do pliku, jeśli jest to wygodniejsze.passthru()
wyjściowe do pliku. Twoje rozwiązanie spełnia dokładnie to, czego potrzebuję. :)Za pomocą
six
modułu możesz to zrobić poprzez:źródło
sys.version daje ci to, czego chcesz, wystarczy wybrać pierwszy numer :)
źródło
Najprostszy sposób
Po prostu wpisz python w swoim terminalu, a zobaczysz wersję następującą
źródło
Jak powiedział Seth, skrypt główny mógłby sprawdzić
sys.version_info
(ale zauważ, że pojawił się dopiero w wersji 2.0, więc jeśli chcesz obsługiwać starsze wersje, musisz sprawdzić właściwość innej wersji modułu sys).Ale nadal musisz uważać, aby w pliku nie używać żadnych funkcji języka Python, które nie są dostępne w starszych wersjach języka Python. Na przykład jest to dozwolone w Pythonie 2.5 i nowszych:
ale nie będzie działać w starszych wersjach Pythona, ponieważ możesz mieć tylko OR w końcu dopasować próbę. Aby zachować zgodność ze starszymi wersjami języka Python, musisz napisać:
źródło
Kilka odpowiedzi już sugeruje, jak wykonać zapytanie do bieżącej wersji Pythona. Aby programowo sprawdzić wymagania dotyczące wersji, skorzystałbym z jednej z dwóch poniższych metod:
źródło
Dla zabawy poniżej opisano sposób na CPython 1.0-3.7b2, Pypy, Jython i Micropython. Jest to bardziej ciekawość niż sposób robienia tego we współczesnym kodzie. Napisałem go jako część http://stromberg.dnsalias.org/~strombrg/pythons/ , który jest skryptem do testowania fragmentu kodu na wielu wersjach Pythona jednocześnie, dzięki czemu można łatwo sprawdzić, który python funkcje są kompatybilne z wersjami Pythona:
źródło
Sprawdź wersję Python:
python -V
lubpython --version
lubapt-cache policy python
możesz także uruchomić,
whereis python
aby zobaczyć, ile zainstalowanych wersji.źródło
Jeśli chcesz wykryć wersję wcześniejszą niż Python 3 i nie chcesz niczego importować ...
... możesz (ab) użyć zakresu określania zakresu listy i zrobić to w jednym wyrażeniu :
źródło
Aby zweryfikować wersję Pythona dla poleceń w systemie Windows, uruchom następujące polecenia w wierszu polecenia i sprawdź dane wyjściowe
Ponadto, aby zobaczyć konfigurację folderu dla każdej wersji Pythona, uruchom następujące polecenia:
źródło
wynik
źródło
print("sys.version: {}".format(version))
.sys.version_info
nie wydaje się zwracaćtuple
od 3,7. Zwraca raczej specjalną klasę, więc wszystkie przykłady z użyciem krotek nie działają, przynajmniej dla mnie. Oto dane wyjściowe z konsoli python:Przekonałem się, że użycie kombinacji
sys.version_info.major
isys.version_info.minor
wydaje się wystarczające. Na przykład,...sprawdza, czy korzystasz z Python 3. Możesz nawet sprawdzić bardziej szczegółowe wersje za pomocą ...
może sprawdzić, czy używasz przynajmniej Python 3.5.
źródło
namedtuple
i porównanie z krotką zdecydowanie działa. Aby uzyskać pełną równość, potrzebujesz pięcioelementowego pisma: major, minor, micro, releaselevel (string) i serial.Jeszcze prostszy i najprostszy sposób:
W Spyder uruchom nową „konsolę IPython”, a następnie uruchom dowolny z istniejących skryptów.
Teraz wersję można zobaczyć na pierwszym wydruku wydrukowanym w oknie konsoli:
„Python 3.7.3 (domyślnie, 24 kwietnia 2019 r., 15:29:51) ...”
źródło
Aby sprawdzić z wiersza poleceń, w jednym poleceniu, ale w wersji major, minor, micro, poziom wydania i numer seryjny :
Uwaga:
.format()
zamiast f-stringów lub'.'.join()
pozwala na użycie dowolnych znaków formatowania i separatorów, np. Aby uczynić to ciągiem wyrazów jednoznacznych. Umieszczam to w skrypcie narzędzia bash, który zgłasza wszystkie ważne wersje: python, numpy, pandy, sklearn, MacOS, xcode, clang, brew, conda, anaconda, gcc / g ++ itp. Przydatny do logowania, replikacji, rozwiązywania problemów itp. Zgłaszania błędów itp. .źródło
Jeśli pracujesz na Linuksie, po prostu daj polecenie
python
wyjściowe będzie wyglądać takźródło
Python
wersji w skrypcie, również podobna odpowiedź już opublikowana wcześniej: stackoverflow.com/a/35294211/950762