Wie schreibt man Python-code ist in der Lage, um zu erzwingen, dass eine minimale python-version?
Ich würde gerne sehen, wenn es irgendeinen Weg gibt, die eine minimal python-version.
Habe ich mehrere python-Module, die eine Python 2.6 durch die neue Ausnahmebehandlung (as
Stichwort).
Sieht es aus, wenn ich überprüfen Sie die python-version am Anfang von meinem script, der code wird nicht ausgeführt, da der interpreter scheitern innerhalb der module, wirft ein hässliches system Fehler, anstatt zu sagen, dass für den Benutzer eine neuere python.
- Siehe auch stackoverflow.com/questions/3035749/... und stackoverflow.com/questions/388069/...
- Die Antwort, die Sie akzeptiert, um stackoverflow.com/questions/3035749 verwenden, die nicht mit new Exception handling.
- UPDATE (29. Oktober 2016): Jetzt setuptools-und pip-Unterstützung
python_requires
Schlüsselwortsetup
Funktion – siehe meine Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nicht verwenden die Python 2.6 Funktionen in das Skript selbst. Außerdem müssen Sie Ihre version überprüfen Sie vor dem importieren alle Module, die eine neue Python-version.
E. g. starten Sie Ihr Skript so auf:
print
denn sonst als Tim wies darauf hin, es würden nicht mit einemSyntaxError
in Python 3 (heikles Geschäft dieser!) Ich denke, dies ist die richtige Weise, es zu tun - meine Methode ist schneller, aber ein bisschen ein hack.print
ist nicht eine gute Wahl für das drucken der Fehlermeldung, weil es Drucke auf stdout standardmäßig; die einfache Lösung ist die Verwendungsys.exit("This script requires Python 2.x, >= 2.6"
) (wie in der akzeptierten Antwort), die Drucke zu stderr und auch beendet mit code 1. (Nebenbei: unter Windows, beim Aufruf mitpythonw.exe
müssten Sie die zusätzliche Arbeit für die Fehler zur Oberfläche).Können Sie nutzen die Tatsache, dass Python das richtige beim Vergleich von Tupeln:
Der einfachste Weg, die ich gefunden habe, dies zu tun (siehe diese Frage auch) ist nur eine Zeile wie:
am Anfang der Datei. Dieser nutzt die Tatsache, dass byte-Literale wurden eingeführt, 2.6 und damit alle früheren Versionen erhöhen wird eine
SyntaxError
mit dem, was Nachricht, die Sie schreiben gegeben, wie die stack-trace.Benötigen Sie Python 2.7, wie etwa:
ist ein syntax-Fehler im 2.6.
Für Python 2.5 das funktionieren sollte:
ist ein syntax-Fehler in 2.4.
print
- Anweisung. Das ist wirklich ein heikles problem.Ab der version 9.0.0 pip unterstützt Benötigt Python Feld in der Verteilung der Metadaten, die geschrieben werden kann, die von setuptools ab version 24-2-0. Diese Funktion ist verfügbar, durch
python_requires
keyword argument zusetup
Funktion.Beispiel (in setup.py):
Nutzen dieses feature hat man zum Paket des Projekt/script zuerst, ob nicht bereits getan haben. Dies ist sehr einfach im typischen Fall und sollte getan werden, dennoch als es erlaubt Benutzern, leicht zu installieren, zu verwenden und deinstallieren Projekt/script. Bitte sehen Python Verpackung Bedienungsanleitung für details.
Auch das Coole daran ist, dass es sein kann, enthalten innerhalb der
__init__
- Datei oder das Modul.Zur Ergänzung der vorhandenen, hilfreichen Antworten:
Möchten Sie vielleicht zu schreiben Skripte, die mit beide Python-2.x und 3.x, und erfordern eine Mindestversion für jeder.
Zum Beispiel, wenn Ihr code verwendet die argparse Modul ist, müssen Sie mindestens 2.7 (mit einer 2.x Python) oder mindestens 3.2 (mit einer 3.x Python).
Dem folgenden snippet implementiert eine solche zu überprüfen; die einzige Sache, die Bedürfnisse die Anpassung an eine andere, aber Analog Szenario sind die
MIN_VERSION_PY2=...
undMIN_VERSION_PY3=...
Aufgaben.Wie bereits angemerkt: dies sollte an den Anfang des Skripts, bevor andere
import
Aussagen.Wenn die version die Anforderungen nicht erfüllt sind, so etwas wie die folgende Meldung auf stderr und das Skript beendet sich mit exit code 1.
Anmerkung: Dies ist eine wesentlich überarbeitete version einer früheren, unnötig komplizierte Antwort, nach der Realisierung - Dank Arkadij die hilfreiche Antwort -, die Vergleichs-Operatoren wie
>
direkt angewendet werden können, um Tupel.Ich vermute, Sie haben etwas wie:
aber module_foo erfordert eine Besondere version? Dies ist der Fall, es ist vollkommen gültig, um die Reihenfolge der code so:
Python nicht erforderlich, die Einfuhr, abgesehen von
from __future__ import [something]
an der Spitze Ihres Codes.Statt Indizierung könnten Sie dies jederzeit tun,
Früher habe ich ein komplizierter Ansatz für die Unterstützung von Python2 und Python ist3, aber ich versuche nicht mehr zu unterstützen, Python2, so dass ich jetzt einfach verwenden:
Wenn Sie die Versionsprüfung fehl, erhalten Sie eine traceback-mit so etwas wie:
unten.
Ich brauche zu machen sicher, ich bin mit Python 3.5 (oder eventuell höher). Ich monkeyed um auf meine eigene, und dann habe ich gedacht, zu Fragen SO - aber ich bin nicht beeindruckt mit den Antworten (sorry, y ' all ::smile::). Anstatt aufzugeben, kam ich mit dem Ansatz unten. Getestet hab ich verschiedene Kombinationen der
min_python
undmax_python
Spezifikation Tupeln und es scheint zu funktionieren sehr schön:Setzen Sie diesen code in einer
__init__.py
ist attraktiv:__init_p3__.py
wie gezeigt in der Probe auskommentierte Letzte Zeile. Vergessen Sie nicht, ersetzen Sie diepkgname
Platzhalter mit den entsprechenden Paketnamen.Wenn Sie nicht möchten, dass ein min (oder max), nur setzen Sie ihn auf
= ()
= (3, )
vergessen Sie nicht das Komma, sonst(3)
ist nur eine eingeklammerte (trivial) Ausdruck der Auswertung zu einem einzigenint
= (3, 4, 1)
HINWEIS: ich bin nicht viel von einem windoof-Programmierer, so dass die
text_cmd_min
undtext_cmd_max
Werte sind ausgerichtet für *Nix-Systeme. Wenn Sie zu beheben, bis der code in anderen Umgebungen (z.B. windoof oder einige insbesondere die *Nix-Variante), dann bitte posten. (Im Idealfall ein einziges super-intelligent code-block wird ausreichen, für alle Umgebungen, aber ich bin zufrieden mit meinen *Nix-nur die Lösung für jetzt.)PS: ich bin relativ neu bei Python, und ich habe nicht einen Dolmetscher mit version kleiner als 2.7.9.endgültig.0, es ist also tuff zu testen, mein code für die früheren Varianten. Auf der anderen Seite, die niemand wirklich interessieren? (Das ist eine tatsächliche Frage, die ich habe: In welcher (real-ish) Kontext würde ich benötigen, um mit der "Graceful Falsch-Python-Version" - problem für Dolmetscher vor 2.7.9?)
__init__.py