Wie kann ich in einem Programm, das neue Sprachfunktionen verwendet, nach Python-Versionen suchen?


239

Wenn ich ein Python-Skript habe, für das mindestens eine bestimmte Version von Python erforderlich ist, wie kann ich dann ordnungsgemäß fehlschlagen, wenn eine frühere Version von Python zum Starten des Skripts verwendet wird?

Wie erhalte ich früh genug die Kontrolle, um eine Fehlermeldung auszugeben und zu beenden?

Zum Beispiel habe ich ein Programm, das den ternery-Operator (neu in 2.5) und "with" -Blöcke (neu in 2.6) verwendet. Ich habe eine einfache kleine Routine zur Überprüfung der Interpreterversion geschrieben, die das erste ist, was das Skript aufrufen würde ... außer es kommt nicht so weit. Stattdessen schlägt das Skript während der Python-Kompilierung fehl, bevor meine Routinen überhaupt aufgerufen werden. Daher sieht der Benutzer des Skripts einige sehr undurchsichtige Rückverfolgungen von Synaxfehlern, bei denen ein Experte feststellen muss, dass einfach die falsche Version von Python ausgeführt wird.

Ich weiß, wie man die Version von Python überprüft. Das Problem ist, dass einige Syntax in älteren Versionen von Python illegal ist. Betrachten Sie dieses Programm:

import sys
if sys.version_info < (2, 4):
    raise "must use python 2.5 or greater"
else:
    # syntax error in 2.4, ok in 2.5
    x = 1 if True else 2
    print x

Wenn ich unter 2.4 laufe, möchte ich dieses Ergebnis

$ ~/bin/python2.4 tern.py 
must use python 2.5 or greater

und nicht dieses Ergebnis:

$ ~/bin/python2.4 tern.py 
  File "tern.py", line 5
    x = 1 if True else 2
           ^
SyntaxError: invalid syntax

(Channeling für einen Mitarbeiter.)


3
"Überprüfen Sie die Version von Python. Das Problem ist, dass einige Syntax in älteren Versionen von Python illegal ist." Ich verstehe nicht, wie das ein Problem ist. Wenn Sie die Version überprüfen können, können Sie den Syntaxfehler vermeiden. Wie gilt die Versionsprüfung nicht für die Syntax? Können Sie Ihre Frage klären?
S.Lott

4
@ S.Lott Nein, Sie liegen nicht falsch, es liegt nur darin, dass die Schwierigkeit darin besteht, den Code an einer Stelle einzuschließen, an der er auch nicht gelesen (analysiert) und nicht ausgeführt wird - dies ist nicht sofort ersichtlich, wie die Antworten zeigen.
Brendan

7
S.Lott, Sie können Ihren Test in der alten Python-Version nicht ausführen, da er nicht kompiliert wird. Stattdessen erhalten Sie einen generischen Syntaxfehler. Probieren Sie den Beispielcode mit einem 2.4-Interpreter aus, und Sie werden feststellen, dass Sie den Versionstest nicht erreichen können.
Mark Harrison

7
@ S.Lott Nun, es hängt davon ab, was Sie für trivial halten - ich persönlich würde nicht in Betracht ziehen, separate Dateien für verschiedene Versionen von Python zu erstellen oder zusätzliche Prozesse trivial zu erzeugen. Ich würde sagen, diese Frage ist wertvoll, besonders wenn man bedenkt, dass Python voller ordentlicher und oft überraschender Tricks ist - ich bin von Google hierher gekommen, um zu wissen, ob es eine ordentliche Antwort gibt
Brendan

7
Ich denke, wir haben das Ende dieser Diskussion erreicht. Ich stellte eine Frage zu etwas, von dem ich nicht wusste, wie ich es machen sollte, und bekam eine Antwort, die mir sagte, wie es geht. Ich schlage nichts vor, ich habe nur die Antwort von orip akzeptiert, die für mich großartig funktioniert (eigentlich der Mitarbeiter, für den ich kanalisiere). Viva Le Stack Überlauf!
Mark Harrison

Antworten:


111

Sie können testen mit eval:

try:
  eval("1 if True else 2")
except SyntaxError:
  # doesn't have ternary

Auch with ist in Python verfügbar 2.5, fügen Sie einfachfrom __future__ import with_statement .

BEARBEITEN: Um die Kontrolle früh genug zu erhalten, können Sie sie .pyvor dem Import in verschiedene Dateien aufteilen und die Kompatibilität in der Hauptdatei überprüfen (z. B. __init__.pyin einem Paket):

# __init__.py

# Check compatibility
try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

# import from another module
from impl import *

10
Das ist eine fantastische Antwort. Das Hauptproblem bei der Frage, die adressiert werden muss, ist, dass ein Programm syntaktisch korrekt sein muss, damit diese Python-Version überhaupt ausgeführt werden kann. Die Verwendung einer neuen Syntax verhindert daher, dass ein Programm mit älteren Versionen des Interpreters gestartet wird. eval arbeitet
darum

7
Wenn das Paket von setuptools installiert wird, schlägt das Bytekompilieren der Quelldateien dann fehl. Außerdem scheinen alle Verrenkungen zur Erzeugung einer Laufzeitfehlermeldung ein wenig sinnlos zu sein - warum nicht einfach die Anforderungen dokumentieren und dabei belassen?
John Machin

2
Beachten Sie, dass Sie beim Versuch, einen Ausdruck anstelle einer einfachen Anweisung zu überprüfen, execstattdessen verwenden müssen eval. Ich hatte dies beim Versuch, eine Funktion zu schreiben, die sowohl in py2k als auch in py3k auf stderr gedruckt wird.
Xiong Chiamiov

2
Ich denke, eine sauberere Version dieser Lösung wäre, Ihre "Schecks" in ein separates Modul zu legen und dieses zu importieren (wickeln Sie die importStation in try / Except). Beachten Sie, dass Sie möglicherweise auch nach anderen Dingen SyntaxErrorsuchen müssen (z. B. nach integrierten Funktionen oder Ergänzungen zur Standardbibliothek)
Steven,

103

Haben Sie einen Wrapper um Ihr Programm, der Folgendes ausführt.

import sys

req_version = (2,5)
cur_version = sys.version_info

if cur_version >= req_version:
   import myApp
   myApp.run()
else:
   print "Your Python interpreter is too old. Please consider upgrading."

Sie können auch die Verwendung in Betracht ziehen sys.version(), wenn Sie vorhaben, Personen zu begegnen, die Python-Interpreter vor 2.0 verwenden, aber dann einige reguläre Ausdrücke zu erledigen haben.

Und es könnte elegantere Möglichkeiten geben, dies zu tun.


7
Zu Ihrer Information, "cur_version> = req_version" sollte als Bedingung funktionieren.
Orip

4
sys.version_infoist keine Funktion.
nh2

3
Das Einfügen von Code in die erfolgreiche Bedingung ist eine ziemlich schlechte Praxis, da es sich um eine unnötige Einrückung und Hinzufügung von Logik handelt. Führen Sie einfach Folgendes aus: if sys.version_info [: 2] <req_version: print "old"; sys.exit () - und fahren Sie ansonsten wie gewohnt fort.
Timss

1
Es ist, wie Tim Peters in "The Zen of Python" sagt: "Flat ist besser als verschachtelt." (Sie können dies sehen, indem Sie "import this" in Python
eingeben

1
@ChristopherShroba Danke für import this. Eine schöne Abwechslung.
Samuel Harmer

32

Versuchen

Importplattform
platform.python_version ()

Sollte Ihnen eine Zeichenfolge wie "2.3.1" geben. Wenn dies nicht genau das ist, was Sie möchten, steht über das integrierte "Plattform" eine Vielzahl von Daten zur Verfügung. Was Sie wollen, sollte irgendwo drin sein.


4
-1: Dies funktioniert nicht, wie in der aktualisierten Frage erläutert. Wenn Sie eine Syntax aus einer neueren Version von Python verwenden, wird Ihre Datei nicht kompiliert, und wenn sie nicht kompiliert wird, kann sie nicht ausgeführt und die Version überprüft werden!
Scott Griffiths

1
@ScottGriffiths Run print(platform.python_version())statt platform.python_version()!
Suriyaa

@ScottGriffiths Überprüfen Sie auch meine Antwort: stackoverflow.com/a/40633458/5157221 .
Suriyaa

22

Der wahrscheinlich beste Weg, um diesen Versionsvergleich durchzuführen, ist die Verwendung von sys.hexversion. Dies ist wichtig, da beim Vergleichen von Versionstupeln nicht in allen Python-Versionen das gewünschte Ergebnis erzielt wird.

import sys
if sys.hexversion < 0x02060000:
    print "yep!"
else:
    print "oops!"

Ich denke, das ist am elegantesten, aber wahrscheinlich nicht am einfachsten für andere Entwickler zu verstehen.
Nick Bolton

5
Können Sie erklären, unter welchen Umständen der Vergleich von Versionstupeln nicht zum gewünschten Ergebnis führt?
SpoonMeiser

Versionstupel können auch alphanumerische Werte enthalten.
Sorin

8
-1: Dies funktioniert nicht, wie in der aktualisierten Frage erläutert. Wenn Sie eine Syntax aus einer neueren Version von Python verwenden, wird Ihre Datei nicht kompiliert, und wenn sie nicht kompiliert wird, kann sie nicht ausgeführt und die Version überprüft werden!
Scott Griffiths

Auf welcher Version / Plattform schlägt dies fehl?
Sorin

15
import sys    
# prints whether python is version 3 or not
python_version = sys.version_info.major
if python_version == 3:
    print("is python 3")
else:
    print("not python 3")

7
Beachten Sie, dass in Python 2.6 und unten, sys.version_infoist nicht ein benannter Tupel. Sie müssen sys.version_info[0]für die Hauptversionsnummer und sys.version_info[1]für die Nebenversion verwenden.
Coredumperror

9

Antwort von Nykakin bei AskUbuntu :

Sie können die Python-Version auch mithilfe des platformModuls aus der Standardbibliothek anhand des Codes selbst überprüfen .

Es gibt zwei Funktionen:

  • platform.python_version() (gibt einen String zurück).
  • platform.python_version_tuple() (gibt Tupel zurück).

Der Python-Code

Erstellen Sie eine Datei zum Beispiel: version.py)

Einfache Methode zum Überprüfen der Version:

import platform

print(platform.python_version())
print(platform.python_version_tuple())

Sie können auch die folgende evalMethode verwenden:

try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

Führen Sie die Python-Datei in einer Befehlszeile aus:

$ python version.py 
2.7.11
('2', '7', '11')

Die Ausgabe von Python mit CGI über einen WAMP-Server unter Windows 10:

Screenshot 2016-11-16 14.39.01 von Suriyaa Kudo


Hilfreiche Ressourcen


7

Sets wurden Teil der Kernsprache in Python 2.4, um abwärtskompatibel zu bleiben. Ich habe das damals gemacht, was auch für Sie funktionieren wird:

if sys.version_info < (2, 4):
    from sets import Set as set

3
besser nach der Funktion als nach der Version zu suchen, nein? try: set except NameError: from sets import Set as set
Orip

@orip: Warum? Wenn Sie wissen, in welcher Version eine Funktion eingeführt wurde, wie hier festgelegt, verwenden Sie einfach den obigen Code. Daran ist nichts auszusetzen.
André

7

Obwohl die Frage lautet: Wie erhalte ich die Kontrolle früh genug, um eine Fehlermeldung auszugeben und zu beenden ?

Die Frage, die ich beantworte, lautet: Wie erhalte ich früh genug die Kontrolle, um vor dem Starten der App eine Fehlermeldung auszugeben ?

Ich kann es ganz anders beantworten als die anderen Beiträge. Bisher scheinen die Antworten zu versuchen, Ihre Frage aus Python heraus zu lösen.

Ich sage, machen Sie eine Versionsprüfung, bevor Sie Python starten. Ich sehe, dein Weg ist Linux oder Unix. Ich kann Ihnen jedoch nur ein Windows-Skript anbieten. Ich würde mir vorstellen, dass die Anpassung an die Linux-Skriptsyntax nicht allzu schwierig wäre.

Hier ist das DOS-Skript mit Version 2.7:

@ECHO OFF
REM see http://ss64.com/nt/for_f.html
FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul
IF NOT ErrorLevel 1 GOTO Python27
ECHO must use python2.7 or greater
GOTO EOF
:Python27
python.exe tern.py
GOTO EOF
:EOF

Dies führt keinen Teil Ihrer Anwendung aus und löst daher keine Python-Ausnahme aus. Es werden keine temporären Dateien erstellt oder Betriebssystemumgebungsvariablen hinzugefügt. Und Ihre App wird aufgrund unterschiedlicher Versionssyntaxregeln nicht zu einer Ausnahme. Das sind drei weniger mögliche Sicherheitspunkte für den Zugriff.

Die FOR /FLinie ist der Schlüssel.

FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul

Informationen zur Version mit mehreren Pythons finden Sie unter der URL: http://www.fpschultze.de/modules/smartfaq/faq.php?faqid=17

Und meine Hack-Version:

[MS-Skript; Überprüfung der Python-Version vor dem Start des Python-Moduls] http://pastebin.com/aAuJ91FQ


Für diese Abstimmungen haben Sie bitte keine Angst, die Gründe dafür zu erklären.
DevPlayer

Genau habe ich gesucht. Vielen Dank! Was ist der %% H?
Clocker

@Clocker python.exe -V würde eine "Python 2.7" -String zurückgeben. Die Konsole fügt die Zeichenfolge "Python" in %% G und die Zeichenfolge "2.7" in das automatisch erstellte Betriebssystem var %% H (der nächste Buchstabe nach G) ein. Echo %% H | find "2.7" leitet "2.7" in den DOS-Befehl find find "2.7", der die Fehlerstufe auf 1 setzt, wenn %% H in "2.7" gefunden wird. Diese Fehlerstufe, die bei Verwendung des Befehls DOS find zu einer 1 führt, ermöglicht es uns, zur DOS-Stapelbezeichnung zu verzweigen: Python27
DevPlayer

3
import sys
sys.version

wird eine Antwort wie diese bekommen

'2.7.6 (Standard, 26. Oktober 2016, 20:30:19) \ n [GCC 4.8.4]'

hier ist 2.7.6 Version


2

Wie oben erwähnt, treten Syntaxfehler zur Kompilierungszeit und nicht zur Laufzeit auf. Während Python eine "interpretierte Sprache" ist, wird Python-Code nicht direkt interpretiert. Es wird zu Bytecode kompiliert, der dann interpretiert wird. Es gibt einen Kompilierungsschritt, der ausgeführt wird, wenn ein Modul importiert wird (wenn keine bereits kompilierte Version in Form einer .pyc- oder .pyd-Datei verfügbar ist), und dann erhalten Sie Ihren Fehler, nicht (ganz genau) wann Ihr Code wird ausgeführt.

Sie können den Kompilierungsschritt verschieben und ihn zur Laufzeit für eine einzelne Codezeile ausführen, wenn Sie möchten, indem Sie wie oben erwähnt eval verwenden. Ich persönlich ziehe es jedoch vor, dies zu vermeiden, da Python dadurch möglicherweise eine Leistung erbringt Eine unnötige Laufzeitkompilierung zum einen und zum anderen schafft das, was sich für mich wie Code-Unordnung anfühlt. (Wenn Sie möchten, können Sie Code generieren, der Code generiert, der Code generiert - und in 6 Monaten eine fabelhafte Zeit damit haben, diesen zu ändern und zu debuggen.) Ich würde also stattdessen etwas Ähnliches empfehlen:

import sys
if sys.hexversion < 0x02060000:
    from my_module_2_5 import thisFunc, thatFunc, theOtherFunc
else:
    from my_module import thisFunc, thatFunc, theOtherFunc

.. was ich tun würde, selbst wenn ich nur eine Funktion hätte, die eine neuere Syntax verwendet und sehr kurz ist. (Tatsächlich würde ich alle vernünftigen Maßnahmen ergreifen, um die Anzahl und Größe solcher Funktionen zu minimieren. Ich könnte sogar eine Funktion wie ifTrueAElseB (cond, a, b) mit dieser einzelnen Syntaxzeile schreiben.)

Eine andere Sache, die es wert sein könnte, darauf hingewiesen zu werden (dass ich ein wenig erstaunt bin, dass noch niemand darauf hingewiesen hat), ist, dass frühere Versionen von Python Code wie diesen nicht unterstützten

value = 'yes' if MyVarIsTrue else 'no'

..es hat Code wie unterstützt

value = MyVarIsTrue and 'yes' or 'no'

Das war die alte Art, ternäre Ausdrücke zu schreiben. Ich habe Python 3 noch nicht installiert, aber soweit ich weiß, funktioniert dieser "alte" Weg bis heute, sodass Sie selbst entscheiden können, ob es sich lohnt, die neue Syntax bei Bedarf unter bestimmten Bedingungen zu verwenden um die Verwendung älterer Versionen von Python zu unterstützen.


2
Ernsthaft? Duplizieren Sie Ihren Code, damit Sie einige kleinere Strukturen ändern können? Yuck. Sehr igitt. Und a and b or cstattdessen b if a else cist es nicht gleichwertig; Wenn bes falsch ist, wird es scheitern und aeher produzieren als b.
Chris Morgan

1
Ich schlage nicht vor, Code zu duplizieren, sondern Wrapper-Funktionen für versionenspezifischen Code zu erstellen, dessen Signaturen sich nicht versionübergreifend ändern, und diese Funktionen in versionenspezifische Module zu integrieren. Ich spreche von Funktionen, die vielleicht 1 bis 5 Zeilen lang sind. Es ist wahr, dass a und b oder c nicht dasselbe sind wie b, wenn a else c in Fällen, in denen b als falsch bewertet werden kann. Ich denke also, wenn AThenBElseC (a, b, c) in common_ops_2_4.py 2 oder 3 Zeilen lang sein müsste, anstatt 1. Diese Methode reduziert Ihren gesamten Code, indem sie allgemeine Redewendungen in Funktionen einkapselt.
Shavais

2

Fügen Sie Folgendes ganz oben in Ihre Datei ein:

import sys

if float(sys.version.split()[0][:3]) < 2.7:
    print "Python 2.7 or higher required to run this code, " + sys.version.split()[0] + " detected, exiting."
    exit(1)

Fahren Sie dann mit dem normalen Python-Code fort:

import ...
import ...
other code...

1
lieber benutzensys.version_info < (2, 7)
Antti Haapala

@AnttiHaapala das ist perfekt für mich, kannst du erklären warum der Vergleich des sys.version_infoTyps mit einem Tupel funktioniert?
JJJ

@jjj war sys.version_info früher ein Tupel; zum Beispiel (2, 4, 6, 'final', 0); nur in Python 3 und 2.7 wurde es in einen separaten Typ geändert, der dennoch mit Tupeln vergleichbar ist.
Antti Haapala

@AnttiHaapala Ich mag diesen Ansatz besser als meinen ... danke!
jml

1

Ich denke, der beste Weg ist, eher auf Funktionalität als auf Versionen zu testen. In einigen Fällen ist dies trivial, in anderen nicht.

z.B:

try :
    # Do stuff
except : # Features weren't found.
    # Do stuff for older versions.

Solange Sie in der Verwendung der Try / Except-Blöcke genau genug sind, können Sie die meisten Ihrer Basen abdecken.


2
Du hast recht. Das ist, was er gefragt hat - manchmal wird das Testen auf Funktionen in Version Y nicht einmal zu Bytecode in Version X kompiliert, daher kann es nicht direkt durchgeführt werden.
Orip

1

Ich habe diese Frage erst nach einer kurzen Suche gefunden, als ich versucht habe, das Problem selbst zu lösen, und ich habe einen Hybrid entwickelt, der auf einigen der obigen Vorschläge basiert.

Ich mag die Idee von DevPlayer, ein Wrapper-Skript zu verwenden, aber der Nachteil ist, dass Sie am Ende mehrere Wrapper für verschiedene Betriebssysteme verwalten. Deshalb habe ich beschlossen, den Wrapper in Python zu schreiben, aber dieselbe grundlegende "Grab the version by run the exe" -Logik zu verwenden und kam mit diesem.

Ich denke, es sollte ab 2.5 funktionieren. Ich habe es bisher auf 2.66, 2.7.0 und 3.1.2 unter Linux und 2.6.1 unter OS X getestet.

import sys, subprocess
args = [sys.executable,"--version"]

output, error = subprocess.Popen(args ,stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()
print("The version is: '%s'"  %error.decode(sys.stdout.encoding).strip("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLMNBVCXZ,.+ \n") )

Ja, ich weiß, dass die endgültige Dekodierungs- / Streifenzeile schrecklich ist, aber ich wollte nur schnell die Versionsnummer abrufen. Ich werde das verfeinern.

Das funktioniert für mich im Moment gut genug, aber wenn jemand es verbessern kann (oder mir sagen kann, warum es eine schreckliche Idee ist), wäre das auch cool.


1

Bei eigenständigen Python-Skripten funktioniert der folgende Modul-Docstring-Trick zum Erzwingen einer Python-Version (hier v2.7.x) (getestet unter * nix).

#!/bin/sh
''''python -V 2>&1 | grep -q 2.7 && exec python -u -- "$0" ${1+"$@"}; echo "python 2.7.x missing"; exit 1 # '''

import sys
[...]

Dies sollte auch die fehlende ausführbare Python-Datei behandeln, ist jedoch von grep abhängig. Hintergrundinformationen finden Sie hier .


0

Sie können mit sys.hexversionoder überprüfen sys.version_info.

sys.hexversionist nicht sehr menschenfreundlich, weil es eine Hexadezimalzahl ist. sys.version_infoist ein Tupel, also menschlicher.

Suchen Sie nach Python 3.6 oder neuer mit sys.hexversion:

import sys, time
if sys.hexversion < 0x30600F0:
    print("You need Python 3.6 or greater.")
    for _ in range(1, 5): time.sleep(1)
    exit()

Suchen Sie nach Python 3.6 oder neuer mit sys.version_info:

import sys, time
if sys.version_info[0] < 3 and sys.version_info[1] < 6:
    print("You need Python 3.6 or greater.")
    for _ in range(1, 5): time.sleep(1)
    exit()

sys.version_infoist menschenfreundlicher, nimmt aber mehr Charaktere auf. Ich würde empfehlensys.hexversion , obwohl es weniger menschenfreundlich ist.

Ich hoffe das hat dir geholfen!


0

Ich erweitere Akhans ausgezeichnete Antwort, die eine hilfreiche Nachricht druckt, bevor das Python-Skript überhaupt kompiliert wird.

Wenn Sie sicherstellen möchten, dass das Skript mit Python 3.6 oder höher ausgeführt wird, fügen Sie diese beiden Zeilen oben in Ihr Python-Skript ein:

#!/bin/sh
''''python3 -c 'import sys; sys.exit(sys.version_info < (3, 6))' && exec python3 -u -- "$0" ${1+"$@"}; echo 'This script requires Python 3.6 or newer.'; exit 1 # '''

(Hinweis: Die zweite Zeile beginnt mit vier einfachen Anführungszeichen und endet mit drei einfachen Anführungszeichen. Dies mag seltsam aussehen, ist aber kein Tippfehler.)

Der Vorteil dieser Lösung ist, dass Code wie print(f'Hello, {name}!')kein verursacht, SyntaxErrorwenn eine Python-Version älter als 3.6 verwendet wird. Stattdessen wird diese hilfreiche Nachricht angezeigt:

This script requires Python 3.6 or newer.

Natürlich funktioniert diese Lösung nur bei Unix-ähnlichen Shells und nur, wenn das Skript direkt aufgerufen wird (z. B. ./script.py:) und die richtigen eXecute-Berechtigungsbits gesetzt sind.


-2

Wie wäre es damit:

import sys

def testPyVer(reqver):
  if float(sys.version[:3]) >= reqver:
    return 1
  else:
    return 0

#blah blah blah, more code

if testPyVer(3.0) == 1:
  #do stuff
else:
  #print python requirement, exit statement

5
-1: Dies funktioniert nicht, wie in der aktualisierten Frage erläutert. Wenn Sie eine Syntax aus einer neueren Version von Python verwenden, wird Ihre Datei nicht kompiliert, und wenn sie nicht kompiliert wird, kann sie nicht ausgeführt und die Version überprüft werden!
Scott Griffiths

-3

Das Problem ist ganz einfach. Sie haben überprüft, ob die Version kleiner als 2.4, nicht kleiner oder gleich . Wenn die Python-Version 2.4 ist, ist sie nicht kleiner als 2.4. Was Sie hätten haben sollen, war:

    if sys.version_info **<=** (2, 4):

nicht

    if sys.version_info < (2, 4):

4
Lesen Sie Absatz 3 und das Update. Sie sind nicht in der Lage, diesen Code auszuführen, da Ihr Code unter 2.4 nicht kompiliert werden kann, wenn Sie die neuen Sprachkonstrukte verwenden.
Mark Harrison

Je weniger als in Ordnung war, nur die Bewertung verpasst.
Craig
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.