Im aktuellen Thread geht es darum, die Python-Version von einem Python-Programm / -Skript aus zu überprüfen. Wenn Sie die auf Ihrem Computer installierte Version des Python-Interpreters über die Befehlszeile überprüfen möchten, lesen Sie bitte den folgenden Beitrag - Welche Python-Version habe ich installiert?
RBT
1
Hier ist eine unterhaltsame Möglichkeit, Python 3 und 2 zu trennen ...python_version = int(str(range(3))[-2])
Chris_Rands
@RBT: Eine einzeilige Überprüfung über die Befehlszeile finden Sie in meiner Antwort .
smci
Antworten:
1378
Diese Informationen sind in der Zeichenfolge sys.version im sys- Modul verfügbar :
>>>import sys
Für Menschen lesbar:
>>>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)]
Um sicherzustellen, dass ein Skript mit einer minimalen Versionsanforderung des Python-Interpreters ausgeführt wird, fügen Sie Folgendes zu Ihrem Code hinzu:
assert sys.version_info >=(2,5)
Dies vergleicht Haupt- und Nebenversionsinformationen. Micro (= 0, 1usw.) und sogar releaselevel (= 'alpha', 'final'usw.) auf das Tupel , wie Sie möchten. Beachten Sie jedoch, dass es fast immer besser ist, zu "ducken", ob eine bestimmte Funktion vorhanden ist, und wenn nicht, eine Problemumgehung (oder eine Rettung). Manchmal verschwinden Funktionen in neueren Versionen und werden durch andere ersetzt.
Es ist eigentlich die Syntax für den Druck. nicht zum Überprüfen der Version. Ich benutze das in meinen Python 2 und 3 Skripten:PY3 = sys.version_info[0] == 3
Sie können auch auf einige der Felder sys.version_infoals Eigenschaften zugreifen , was PY3 = sys.version_info.major == 3möglicherweise etwas ansprechender ist.
@gcb Ihr Code-Snippet wird immer dann unterbrochen, wenn Python 4 passiert. Du solltest es tun if sys.version_info >= (3,). Es ist total pythonisch, Tupel unterschiedlicher Größe zu vergleichen, und es wird das Richtige tun.
Boris
374
Über die Befehlszeile (beachten Sie das Großbuchstaben 'V'):
Das ist eine raffinierte Version, die ich nicht gesehen hatte und die (zumindest für mich) etwas einfacher zu bedienen ist als die reguläre Version ...
Wayne Werner
6
@sorin: Kannst du erklären, wie das besser ist als zum Beispiel Seths Antwort? Da Sie sagen, dass dies das Beste ist, frage ich mich.
0xC0000022L
3
@ 0xC0000022L Hatten Sie sich jemals gefragt, wie Sie den Text aus dem Tupel vergleichen könnten? Wie ist 'final' im Vergleich zu Beta, RC oder was auch immer es dort sein könnte? Wenn Sie stattdessen einen numerischen Wert haben, können Sie immer eine genaue Version angeben.
Sorin
1
@sorin: ähm, das ist nicht gerade wichtig, oder? Wenn ich gegen vergleiche (2,6,4)das 'final'scheint nicht den Vergleich zu beeinflussen , und es ist nicht anzunehmen. Anscheinend ist kein Schneiden erforderlich, wenn ich die "wichtigsten" Teile des Tupels vergleiche. So scheint es behandelt zu werden und darum ging es in meiner Frage. Ich sage nicht, dass diese Lösung keinen Wert hat, ich frage mich nur, warum sie die beste ist - dh was mir fehlt.
0xC0000022L
11
Der Release-Level ist definiert als "Alpha", "Beta", "Kandidat" oder "Final", was ebenfalls korrekt verglichen wird ...
Fredrik
65
Ihre beste Wette ist wahrscheinlich so:
>>>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
>>>
Darüber hinaus können Sie Ihre Importe jederzeit in einem einfachen Versuch verpacken, der Syntaxfehler abfangen sollte. Und bis zu @ Heikkis Punkt wird dieser Code mit viel älteren Versionen von Python kompatibel sein:
>>>try:...from my_module import twoPointSixCode
...exceptException:...print"can't import, probably because your python is too old!">>>
Warum eine einfache Ausnahme und kein ImportError? : P
tödlich
4
@deadly - ImportError fängt keine SyntaxErrors ab, die ausgelöst werden, wenn Sie versuchen, eine neue Syntax in einer alten Python zu verwenden, z. B. wenn Sie versuchen, die bedingte Verknüpfung in Version vor 2.5 zu verwenden.
Seth
except Exceptionist zu breit. Wäre es nicht besser, bestimmte Ausnahmen zu verwenden, die Sie erwarten?
Fermi Paradox
1
@Fermiparadox - Breit zu sein hält die Annahmen niedrig. Die except Exception:Zeile selbst nimmt bereits eine moderne (2.x +) Python an. Vielleicht ordnet ein zukünftiger Python Ausnahmenamen auf eine rückwärts inkompatible Weise neu an? (Wahrscheinlich nicht, aber wer weiß, wie Python in 20 Jahren aussehen wird, wenn wir alle Okulus-Rift-Augapfel-Implantate haben? Code hält lange an.)
Für die Druckfunktion wäre es besser, in Klammern über Kompatibilität nachzudenken. Wenn jemand Beispiel in Version 3 verwendet, wartet dort ein Syntaxfehler.
Alex Chiang
47
Setzen Sie etwas wie:
#!/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)
oben in Ihrem Skript.
Beachten Sie, dass ältere Versionen von Python als das Ziel möglicherweise nicht einmal das Skript laden können, je nachdem, was sich sonst noch in Ihrem Skript befindet. Daher werden Sie nicht weit genug kommen, um diesen Fehler zu melden. Um dieses Problem zu umgehen, können Sie die oben genannten Schritte in einem Skript ausführen, das das Skript mit dem moderneren Code importiert.
Dies ist falsch (oder zumindest unvollständig), da die alten Interpreter auf neuere Sprachkonstrukte wie z x if Pred() else y. Sie werden während der "Lexing" -Phase sterben und haben nie die Chance, sie tatsächlich auszuführenexit(1) . Seths Antwort ist richtig, wenn es darum geht, die neuen Sprachfunktionen in andere Dateien zu kapseln.
Mark Rushakoff
2
@ MarkRushakoff: Ihr Kommentar ist verwirrend. Welcher Aspekt dieser Antwort ist falsch? Der fehlende elseZweig oder für den a <verwendet wird version_info? AFAIK Python füllt fehlende Werte in Tupeln auf, und all dies sollte vor 2.6 gültig sein, nein? Seths Antwort verwendet also das Schneiden (redundant), während dies nicht der Fall ist, und das macht Ihren Kommentar noch verwirrender.
0xC0000022L
5
Ich denke, was @MarkRushakoff sagt, ist, dass, wenn Sie dies oben in einer Datei haben und eine neue Sprachfunktion an anderer Stelle in derselben Datei, die alte Version von Python beim Laden der Datei stirbt, bevor sie ausgeführt wird. Daher wird der Fehler nicht angezeigt. Grundsätzlich müssen Sie das Obige (oder eine andere Prüfung) oben in eine Datei einfügen und dann den Code, für den eine neue Python-Version erforderlich ist, aus separaten Dateien importieren.
rjmunro
1
Ja, was @rjmunro gesagt hat :)
Mark Rushakoff
25
Hier ist eine kurze Befehlszeilenversion, die sofort beendet wird (praktisch für Skripte und automatisierte Ausführung):
@ Vigilancer Sie haben Recht, zum Zeitpunkt des Schreibens war es noch nicht so relevant, aber ich habe es jetzt für Python 3 aktualisiert :)
Wolph
Schön, das löst mein Problem, bei dem ich die Versionsnummer erhalten habe, indem ich die Ausgabe von python2 --versionund python3 --versionvon PHP erfasst habe . Während ich das letztere ohne Probleme über bekommen würde, würde passthru()das erstere nur auf dem Bildschirm drucken, aber niemals erfasst werden, selbst wenn es in eine Datei umgeleitet würde ...
Tox
1
@tox Sie können festlegen print() , dass in eine Datei geschrieben werden soll, wenn dies bequemer ist.
Wolph
In meinem Fall wäre das eher dasselbe, als wenn ich die passthru()Ausgabe bereits in eine Datei umleiten würde . Ihre Lösung macht genau das, was ich brauche. :)
Tox
14
Mit dem sixModul können Sie dies tun durch:
import six
if six.PY2:# this is python2.xelse:# six.PY3# this is python3.x
"Der einfachste Weg" ... etwas anderes zu tun als gewünscht.
Luc
4
Wie Seth sagte, konnte das Hauptskript dies überprüfen sys.version_info(beachten Sie jedoch, dass dies erst in Version 2.0 angezeigt wurde. Wenn Sie also ältere Versionen unterstützen möchten, müssen Sie eine andere Versionseigenschaft des sys-Moduls überprüfen).
Sie müssen jedoch weiterhin darauf achten, keine Python-Sprachfunktionen in der Datei zu verwenden, die in älteren Python-Versionen nicht verfügbar sind. Dies ist beispielsweise in Python 2.5 und höher zulässig:
try:passexcept:passfinally:pass
funktioniert aber nicht in älteren Python-Versionen, da Sie nur außer ODER endlich mit dem Versuch übereinstimmen konnten. Für die Kompatibilität mit älteren Python-Versionen müssen Sie also Folgendes schreiben:
In mehreren Antworten wird bereits vorgeschlagen, wie die aktuelle Python-Version abgefragt werden soll . Um die Versionsanforderungen programmgesteuert zu überprüfen , würde ich eine der folgenden zwei Methoden verwenden:
# 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")
Nur zum Spaß ist das Folgende eine Möglichkeit, dies auf CPython 1.0-3.7b2, Pypy, Jython und Micropython zu tun. Dies ist eher eine Kuriosität als eine Möglichkeit, dies in modernem Code zu tun. Ich habe es als Teil von http://stromberg.dnsalias.org/~strombrg/pythons/ geschrieben , einem Skript zum gleichzeitigen Testen eines Codeausschnitts auf vielen Python-Versionen, damit Sie leicht ein Gefühl dafür bekommen, was Python ist Funktionen sind kompatibel mit welchen Versionen von Python:
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")
Gleiche Antwort wurde bereits gepostet. und Die Frage lautet nicht "Wie überprüfe ich, welche Python-Version ich installiert habe?" aber "Wie überprüfe ich die Version in meinem Skript".
Stanley Kou
2
Wenn Sie Pre-Python 3 erkennen und nichts importieren möchten ...
... Sie können Änderungen des Listenverständnisses (ab) verwenden und dies in einem einzigen Ausdruck tun :
is_python_3_or_above =(lambda x:[x for x in[False]]andNoneor x)(True)
Führen Sie die folgenden Befehle an einer Eingabeaufforderung aus, um die Python-Version für Befehle unter Windows zu überprüfen, und überprüfen Sie die Ausgabe
Für Python 2.7 müssen wir verwenden print("sys.version: {}".format(version)).
Marco
@ Marco, richtig. Die Formatierung von Zeichenfolgen erfolgt ab Version 3 mit Schlüsselwortargumenten. kann als Druckformat ('[{}, {}, {}]'. Format (1,2,3)) für Python 2.7 ausgeführt werden. ref: stackoverflow.com/questions/517355/string-formatting-in-python
oetzi
1
sys.version_infoscheint ab tuple3.7 kein a zurückzugeben . Vielmehr wird eine spezielle Klasse zurückgegeben, sodass zumindest für mich nicht alle Beispiele mit Tupeln funktionieren. Hier ist die Ausgabe von einer Python-Konsole:
Es ist so etwas wie eine Unterklasse von namedtupleund der Vergleich mit Tupel funktioniert definitiv. Um die volle Gleichheit zu erreichen, benötigen Sie einen Typ mit fünf Elementen: Dur, Moll, Mikro, Releaselevel (String) und Seriell.
Mikhail Edoshin
0
Der noch einfachere und einfachste Weg:
Starten Sie in Spyder eine neue "IPython-Konsole" und führen Sie dann eines Ihrer vorhandenen Skripte aus.
Jetzt ist die Version in der ersten Ausgabe zu sehen, die im Konsolenfenster gedruckt wird:
"Python 3.7.3 (Standard, 24. April 2019, 15:29:51) ..."
Hinweis: .format()Anstelle von F-Strings oder '.'.join()können Sie beliebige Formatierungs- und Trennzeichen verwenden, z. B. um dies zu einem greifbaren Ein-Wort-String zu machen. Ich habe dies in ein Bash-Dienstprogramm-Skript eingefügt, das alle wichtigen Versionen meldet: Python, Numpy, Pandas, Sklearn, MacOS, Xcode, Clang, Brew, Conda, Anaconda, gcc / g ++ usw. Nützlich für die Protokollierung, Replizierbarkeit, Fehlerbehebung bei der Fehlerberichterstattung usw. .
Ich möchte, dass mein Python-Skript die Version von Python erhält, die es interpretiert. Die richtige Antwort wurde akzeptiert.
Träger
Das hilft nicht, die PythonVersion innerhalb des Skripts zu erhalten, auch eine ähnliche Antwort, die bereits zuvor veröffentlicht wurde: stackoverflow.com/a/35294211/950762
python_version = int(str(range(3))[-2])
Antworten:
Diese Informationen sind in der Zeichenfolge sys.version im sys- Modul verfügbar :
Für Menschen lesbar:
Zur Weiterverarbeitung:
Um sicherzustellen, dass ein Skript mit einer minimalen Versionsanforderung des Python-Interpreters ausgeführt wird, fügen Sie Folgendes zu Ihrem Code hinzu:
Dies vergleicht Haupt- und Nebenversionsinformationen. Micro (=
0
,1
usw.) und sogar releaselevel (='alpha'
,'final'
usw.) auf das Tupel , wie Sie möchten. Beachten Sie jedoch, dass es fast immer besser ist, zu "ducken", ob eine bestimmte Funktion vorhanden ist, und wenn nicht, eine Problemumgehung (oder eine Rettung). Manchmal verschwinden Funktionen in neueren Versionen und werden durch andere ersetzt.quelle
PY3 = sys.version_info[0] == 3
sys.version_info
als Eigenschaften zugreifen , wasPY3 = sys.version_info.major == 3
möglicherweise etwas ansprechender ist.if sys.version_info >= (3,)
. Es ist total pythonisch, Tupel unterschiedlicher Größe zu vergleichen, und es wird das Richtige tun.Über die Befehlszeile (beachten Sie das Großbuchstaben 'V'):
Dies ist in 'man python' dokumentiert.
quelle
Ich mag
sys.hexversion
solche Sachen.http://docs.python.org/library/sys.html#sys.hexversion
quelle
(2,6,4)
das'final'
scheint nicht den Vergleich zu beeinflussen , und es ist nicht anzunehmen. Anscheinend ist kein Schneiden erforderlich, wenn ich die "wichtigsten" Teile des Tupels vergleiche. So scheint es behandelt zu werden und darum ging es in meiner Frage. Ich sage nicht, dass diese Lösung keinen Wert hat, ich frage mich nur, warum sie die beste ist - dh was mir fehlt.Ihre beste Wette ist wahrscheinlich so:
Darüber hinaus können Sie Ihre Importe jederzeit in einem einfachen Versuch verpacken, der Syntaxfehler abfangen sollte. Und bis zu @ Heikkis Punkt wird dieser Code mit viel älteren Versionen von Python kompatibel sein:
quelle
except Exception
ist zu breit. Wäre es nicht besser, bestimmte Ausnahmen zu verwenden, die Sie erwarten?except Exception:
Zeile selbst nimmt bereits eine moderne (2.x +) Python an. Vielleicht ordnet ein zukünftiger Python Ausnahmenamen auf eine rückwärts inkompatible Weise neu an? (Wahrscheinlich nicht, aber wer weiß, wie Python in 20 Jahren aussehen wird, wenn wir alle Okulus-Rift-Augapfel-Implantate haben? Code hält lange an.)Verwenden Sie
platform
'spython_version
aus der stdlib:quelle
Setzen Sie etwas wie:
oben in Ihrem Skript.
Beachten Sie, dass ältere Versionen von Python als das Ziel möglicherweise nicht einmal das Skript laden können, je nachdem, was sich sonst noch in Ihrem Skript befindet. Daher werden Sie nicht weit genug kommen, um diesen Fehler zu melden. Um dieses Problem zu umgehen, können Sie die oben genannten Schritte in einem Skript ausführen, das das Skript mit dem moderneren Code importiert.
quelle
x if Pred() else y
. Sie werden während der "Lexing" -Phase sterben und haben nie die Chance, sie tatsächlich auszuführenexit(1)
. Seths Antwort ist richtig, wenn es darum geht, die neuen Sprachfunktionen in andere Dateien zu kapseln.else
Zweig oder für den a<
verwendet wirdversion_info
? AFAIK Python füllt fehlende Werte in Tupeln auf, und all dies sollte vor 2.6 gültig sein, nein? Seths Antwort verwendet also das Schneiden (redundant), während dies nicht der Fall ist, und das macht Ihren Kommentar noch verwirrender.Hier ist eine kurze Befehlszeilenversion, die sofort beendet wird (praktisch für Skripte und automatisierte Ausführung):
Oder nur Dur, Moll und Mikro:
quelle
python2 --version
undpython3 --version
von PHP erfasst habe . Während ich das letztere ohne Probleme über bekommen würde, würdepassthru()
das erstere nur auf dem Bildschirm drucken, aber niemals erfasst werden, selbst wenn es in eine Datei umgeleitet würde ...print()
, dass in eine Datei geschrieben werden soll, wenn dies bequemer ist.passthru()
Ausgabe bereits in eine Datei umleiten würde . Ihre Lösung macht genau das, was ich brauche. :)Mit dem
six
Modul können Sie dies tun durch:quelle
sys.version gibt dir was du willst, wähle einfach die erste Nummer :)
quelle
Der einfachste Weg
Geben Sie einfach Python in Ihr Terminal ein und Sie können die folgende Version sehen
quelle
Wie Seth sagte, konnte das Hauptskript dies überprüfen
sys.version_info
(beachten Sie jedoch, dass dies erst in Version 2.0 angezeigt wurde. Wenn Sie also ältere Versionen unterstützen möchten, müssen Sie eine andere Versionseigenschaft des sys-Moduls überprüfen).Sie müssen jedoch weiterhin darauf achten, keine Python-Sprachfunktionen in der Datei zu verwenden, die in älteren Python-Versionen nicht verfügbar sind. Dies ist beispielsweise in Python 2.5 und höher zulässig:
funktioniert aber nicht in älteren Python-Versionen, da Sie nur außer ODER endlich mit dem Versuch übereinstimmen konnten. Für die Kompatibilität mit älteren Python-Versionen müssen Sie also Folgendes schreiben:
quelle
In mehreren Antworten wird bereits vorgeschlagen, wie die aktuelle Python-Version abgefragt werden soll . Um die Versionsanforderungen programmgesteuert zu überprüfen , würde ich eine der folgenden zwei Methoden verwenden:
quelle
Nur zum Spaß ist das Folgende eine Möglichkeit, dies auf CPython 1.0-3.7b2, Pypy, Jython und Micropython zu tun. Dies ist eher eine Kuriosität als eine Möglichkeit, dies in modernem Code zu tun. Ich habe es als Teil von http://stromberg.dnsalias.org/~strombrg/pythons/ geschrieben , einem Skript zum gleichzeitigen Testen eines Codeausschnitts auf vielen Python-Versionen, damit Sie leicht ein Gefühl dafür bekommen, was Python ist Funktionen sind kompatibel mit welchen Versionen von Python:
quelle
Überprüfen Sie die Python-Version:
python -V
oderpython --version
oderapt-cache policy python
Sie können auch ausführen, um
whereis python
zu sehen, wie viele Versionen installiert sind.quelle
Wenn Sie Pre-Python 3 erkennen und nichts importieren möchten ...
... Sie können Änderungen des Listenverständnisses (ab) verwenden und dies in einem einzigen Ausdruck tun :
quelle
Führen Sie die folgenden Befehle an einer Eingabeaufforderung aus, um die Python-Version für Befehle unter Windows zu überprüfen, und überprüfen Sie die Ausgabe
Führen Sie die folgenden Befehle aus, um die Ordnerkonfiguration für jede Python-Version anzuzeigen:
quelle
Ausgabe
quelle
print("sys.version: {}".format(version))
.sys.version_info
scheint abtuple
3.7 kein a zurückzugeben . Vielmehr wird eine spezielle Klasse zurückgegeben, sodass zumindest für mich nicht alle Beispiele mit Tupeln funktionieren. Hier ist die Ausgabe von einer Python-Konsole:Ich habe festgestellt, dass die Verwendung einer Kombination von
sys.version_info.major
undsys.version_info.minor
scheint zu genügen. Zum Beispiel,...prüft, ob Sie Python 3 ausführen. Sie können sogar mit ...
kann überprüfen, ob Sie mindestens Python 3.5 ausführen.
quelle
namedtuple
und der Vergleich mit Tupel funktioniert definitiv. Um die volle Gleichheit zu erreichen, benötigen Sie einen Typ mit fünf Elementen: Dur, Moll, Mikro, Releaselevel (String) und Seriell.Der noch einfachere und einfachste Weg:
Starten Sie in Spyder eine neue "IPython-Konsole" und führen Sie dann eines Ihrer vorhandenen Skripte aus.
Jetzt ist die Version in der ersten Ausgabe zu sehen, die im Konsolenfenster gedruckt wird:
"Python 3.7.3 (Standard, 24. April 2019, 15:29:51) ..."
quelle
So überprüfen Sie über die Befehlszeile in einem einzigen Befehl, einschließlich Major, Minor, Micro-Version, Releaselevel und Serial :
Hinweis:
.format()
Anstelle von F-Strings oder'.'.join()
können Sie beliebige Formatierungs- und Trennzeichen verwenden, z. B. um dies zu einem greifbaren Ein-Wort-String zu machen. Ich habe dies in ein Bash-Dienstprogramm-Skript eingefügt, das alle wichtigen Versionen meldet: Python, Numpy, Pandas, Sklearn, MacOS, Xcode, Clang, Brew, Conda, Anaconda, gcc / g ++ usw. Nützlich für die Protokollierung, Replizierbarkeit, Fehlerbehebung bei der Fehlerberichterstattung usw. .quelle
Wenn Sie unter Linux arbeiten, geben Sie einfach die Befehlsausgabe
python
so ausquelle
Python
Version innerhalb des Skripts zu erhalten, auch eine ähnliche Antwort, die bereits zuvor veröffentlicht wurde: stackoverflow.com/a/35294211/950762