Wie überprüfe ich, in welcher Python-Version mein Skript ausgeführt wird?

1185

Wie kann ich überprüfen, welche Version des Python-Interpreters mein Skript interpretiert?

Träger
quelle
1
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, Jul 31 2008, 17:28:52) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]

Zur Weiterverarbeitung:

>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192

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.

krawyoti
quelle
39
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
GCB
5
PY2 = sys.version_info [0] == 2 PY3 = sys.version_info [0] == 3
xiaoweiz
25
Sie können auch auf einige der Felder sys.version_infoals Eigenschaften zugreifen , was PY3 = sys.version_info.major == 3möglicherweise etwas ansprechender ist.
krs013
1
Hinweis: sys.hexversion wird mit 0x020502F0 verglichen, siehe docs.python.org/2/library/sys.html#sys.hexversion
Yinon Ehrlich
1
@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'):

python -V

Dies ist in 'man python' dokumentiert.

jcolino
quelle
13
Hauptstadt V ist Version, nicht Kleinbuchstaben
Rogue
96

Ich mag sys.hexversionsolche Sachen.

http://docs.python.org/library/sys.html#sys.hexversion

>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
brianz
quelle
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)
>>> if not 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
... except Exception: 
...     print "can't import, probably because your python is too old!"
>>>
Seth
quelle
3
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.)
Seth
65

Verwenden Sie platform'spython_version aus der stdlib:

>>> from platform import python_version
>>> print(python_version())
2.7.8
Rechnung
quelle
5
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/python
import 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.

rjmunro
quelle
6
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ühren exit(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):

python -c "print(__import__('sys').version)"

Oder nur Dur, Moll und Mikro:

python -c "print(__import__('sys').version_info[:1])" # (2,)
python -c "print(__import__('sys').version_info[:2])" # (2, 7)
python -c "print(__import__('sys').version_info[:3])" # (2, 7, 6)
Wolph
quelle
1
@ 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.x
else:
  # six.PY3
  # this is python3.x
Dzhuang
quelle
8
import sys
sys.version.split(' ')[0]

sys.version gibt dir was du willst, wähle einfach die erste Nummer :)

Fengshaun
quelle
5

Der einfachste Weg

Geben Sie einfach Python in Ihr Terminal ein und Sie können die folgende Version sehen

desktop:~$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
cjahangir
quelle
23
"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:
    pass
except:
    pass
finally:
    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:

try:
    try:
        pass
    except:
        pass
finally:
    pass
Heikki Toivonen
quelle
2

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 import StrictVersion 
assert(StrictVersion(platform.python_version()) >= "2.6")
normanius
quelle
2

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 = 0
try:
    import platform
except (ImportError, NameError):
    # We have no platform module - try to get the info via the sys module
    check_sys = 1

if not check_sys:
    if hasattr(platform, "python_version"):
        via_platform = 1
    else:
        check_sys = 1

if check_sys:
    try:
        import sys
        test_sys = 1
    except (ImportError, NameError):
        # just let via_sys_version_info and via_sys_version remain False - we have no sys module
        pass

if test_sys:
    if hasattr(sys, "version_info"):
        via_sys_version_info = 1
    elif hasattr(sys, "version"):
        via_sys_version = 1
    else:
        # just let via_sys remain False
        pass

if 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")
Dstromberg
quelle
2

Überprüfen Sie die Python-Version: python -Voder python --versionoderapt-cache policy python

Sie können auch ausführen, um whereis pythonzu sehen, wie viele Versionen installiert sind.

Shusen Yi
quelle
3
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]] and None or x)(True)
user541686
quelle
2

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

c:\>python -V
Python 2.7.16

c:\>py -2 -V
Python 2.7.16

c:\>py -3 -V
Python 3.7.3

Führen Sie die folgenden Befehle aus, um die Ordnerkonfiguration für jede Python-Version anzuzeigen:

For Python 2,'py -2 -m site'
For Python 3,'py -3 -m site'
Aamir M Meman
quelle
2
from sys import version_info, api_version, version, hexversion

print(f"sys.version: {version}")
print(f"sys.api_version: {api_version}")
print(f"sys.version_info: {version_info}")
print(f"sys.hexversion: {hexversion}")

Ausgabe

sys.version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
sys.api_version: 1013
sys.version_info: sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)
sys.hexversion: 50726384
oetzi
quelle
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:

>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>

Ich habe festgestellt, dass die Verwendung einer Kombination von sys.version_info.majorund sys.version_info.minorscheint zu genügen. Zum Beispiel,...

import sys
if sys.version_info.major > 3:
    print('Upgrade to Python 3')
    exit(1)

prüft, ob Sie Python 3 ausführen. Sie können sogar mit ...

import sys
ver = sys.version_info
if ver.major > 2:
    if ver.major == 3 and ver.minor <= 4:
        print('Upgrade to Python 3.5')
        exit(1)

kann überprüfen, ob Sie mindestens Python 3.5 ausführen.

Parker E.
quelle
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) ..."

Geben Sie hier die Bildbeschreibung ein

S. Jessen
quelle
0

So überprüfen Sie über die Befehlszeile in einem einzigen Befehl, einschließlich Major, Minor, Micro-Version, Releaselevel und Serial :

> python -c "import sys; print('{}.{}.{}-{}-{}'.format(*sys.version_info))"

3.7.6-final-0

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. .

smci
quelle
-1

Wenn Sie unter Linux arbeiten, geben Sie einfach die Befehlsausgabe python so aus

Python 2.4.3 (# 1, 11. Juni 2009, 14:09:37)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] unter Linux2

Geben Sie "Hilfe", "Copyright", "Credits" oder "Lizenz" ein, um weitere Informationen zu erhalten.

pkm
quelle
5
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
Akif