Wie kann ich überprüfen, welche Version des Python-Interpreters mein Skript interpretiert?
python_version = int(str(range(3))[-2])
Wie kann ich überprüfen, welche Version des Python-Interpreters mein Skript interpretiert?
python_version = int(str(range(3))[-2])
Antworten:
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
, 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.
PY3 = sys.version_info[0] == 3
sys.version_info
als Eigenschaften zugreifen , was PY3 = 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.
Ich mag sys.hexversion
solche Sachen.
http://docs.python.org/library/sys.html#sys.hexversion
>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
(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:
>>> 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!"
>>>
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:
>>> from platform import python_version
>>> print(python_version())
2.7.8
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.
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.
else
Zweig 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.
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)
python2 --version
und python3 --version
von 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 ...
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. :)
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.
>>>
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
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")
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")
Überprüfen Sie die Python-Version: python -V
oder python --version
oderapt-cache policy python
Sie können auch ausführen, um whereis python
zu sehen, wie viele Versionen installiert sind.
... 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)
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'
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
print("sys.version: {}".format(version))
.
sys.version_info
scheint ab tuple
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:
>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>
Ich habe festgestellt, dass die Verwendung einer Kombination von sys.version_info.major
und sys.version_info.minor
scheint 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.
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) ..."
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. .
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.
Python
Version innerhalb des Skripts zu erhalten, auch eine ähnliche Antwort, die bereits zuvor veröffentlicht wurde: stackoverflow.com/a/35294211/950762