Soweit ich weiß, hat Python drei Möglichkeiten, um herauszufinden, auf welchem Betriebssystem es ausgeführt wird:
os.name
sys.platform
platform.system()
Die Kenntnis dieser Informationen ist häufig bei bedingten Importen oder bei der Verwendung von Funktionen hilfreich, die sich zwischen den Plattformen unterscheiden (z. B. time.clock()
unter Windows und time.time()
UNIX).
Meine Frage ist, warum 3 verschiedene Möglichkeiten, dies zu tun? Wann sollte ein Weg benutzt werden und nicht ein anderer? Welcher Weg ist der "beste" (am zukunftssichersten oder am wenigsten wahrscheinlich, um ein bestimmtes System, auf dem Ihr Programm tatsächlich ausgeführt werden kann, versehentlich auszuschließen)?
Es scheint sys.platform
spezifischer zu sein als os.name
, so dass Sie win32
zwischen cygwin
(im Gegensatz zu nur nt
) und linux2
von darwin
(im Gegensatz zu nur posix
) unterscheiden können. Aber wenn dem so ist, was ist dann mit dem Unterschied zwischen sys.platform
und platform.system()
?
Was zum Beispiel besser ist:
import sys
if sys.platform == 'linux2':
# Do Linux-specific stuff
oder dieses? ::
import platform
if platform.system() == 'Linux':
# Do Linux-specific stuff
Im Moment bleibe ich dabei sys.platform
, daher ist diese Frage nicht besonders dringend, aber ich wäre sehr dankbar für eine Klarstellung in dieser Hinsicht.
quelle
sys.platform.startswith('linux')
anstelle vonsys.platform == 'linux2'
für zukünftige KompatibilitätAntworten:
Tauchte ein bisschen in den Quellcode ein.
Die Ausgabe von
sys.platform
undos.name
wird zur Kompilierungszeit bestimmt.platform.system()
bestimmt den Systemtyp zur Laufzeit.sys.platform
wird während der Build-Konfiguration als Compiler-Definition angegeben.os.name
überprüft , ob bestimmte os spezifische Module zur Verfügung (zBposix
,nt
, ...)platform.system()
wird tatsächlich ausgeführtuname
und möglicherweise mehrere andere Funktionen, um den Systemtyp zur Laufzeit zu bestimmen.Mein Vorschlag:
os.name
Sie diese Option, um zu überprüfen, ob es sich um ein Posix-kompatibles System handelt.sys.platform
Sie diese Option, um zu überprüfen, ob es sich um Linux, Cygwin, Darwin, Atheos usw. handelt.platform.system()
Sie, wenn Sie den anderen Quellen nicht glauben.quelle
Es gibt einen dünnen Linienunterschied zwischen
platform.system()
undsys.platform
und interessanterweiseplatform.system()
degeneriert in den meisten Fällen zusys.platform
Hier ist, was die Quelle
Python2.7\Lib\Platform.py\system
sagtAuch laut Dokumentation
quelle
Aus
sys.platform
Dokumenten :os.name
hat eine gröbere Körnigkeitos.uname()
gibt systemabhängige Versionsinformationenplatform
Modul bietet detaillierte Überprüfungen der SystemidentitätOft ist der "beste" zukunftssichere Weg, um zu testen, ob einige Funktionen verfügbar sind, nur zu versuchen, sie zu verwenden und einen Fallback zu verwenden, wenn sie fehlschlägt.
platform.system()
einen normalisierten Wert zurückgibt , dass es aus mehreren Quellen erhalten könnte:os.uname()
,sys.platform
,ver
Befehl (unter Windows).quelle
Es hängt davon ab, ob Sie es vorziehen, eine Ausnahme auszulösen oder etwas auf einem nicht getesteten System zu versuchen, und ob Ihr Code so hoch oder so niedrig ist, dass er auf einem ähnlichen nicht getesteten System (z. B. ungetestetem Mac - 'posix' oder auf) funktionieren kann oder nicht eingebettete ARM-Systeme). Pythonischer ist es, nicht alle bekannten Systeme aufzulisten, sondern mögliche relevante Eigenschaften zu testen. (zB wird die Endianität des Systems als wichtig angesehen, aber unwichtige Mehrfachverarbeitungseigenschaften.)
os.name ist eine ausreichende Auflösung für die korrekte Verwendung des
os
Moduls. Mögliche Werte sind 'posix', 'nt', 'os2', 'ce', 'java' oder 'riscos' in Python 2.7, während seit Python 3.4 nur 'posix', 'nt' und 'java' verwendet werden.sys.platform ist eine feinere Auflösung. Es wird empfohlen,
if sys.platform.startswith('linux')
idiom zu verwenden, da "linux2" einen Linux-Kernel der Version 2.xx oder 3 bedeutet. Ältere Kernel werden derzeit nie verwendet. In Python 3.3 sind alle Linux-Systeme einfach 'Linux'.Ich kenne die Besonderheiten von "Mac" - und "Java" -Systemen nicht und kann daher die Ergebnisse der sehr guten Methode platform.system () nicht zum Verzweigen verwenden, aber ich würde die Vorteile des
platform
Moduls für Nachrichten und Fehlerprotokollierung nutzen.quelle
os.name
mögliche Rückgabewerte sind'posix'
,'nt'
,'java'
nach Python 3 - Dokumenten . Siehe auch: Plattformmodul-Dokumente . Ich nicht glauben ,'riscos'
und'os2
"sind mögliche Rückgabewerte ausos.name
; Sie können Rückgabewerte von seinsys.platform
. Die Python 3-sys.platform
Dokumentation scheint nicht vollständig zu sein.os.name
Version zu Version konsistent ist. Ich habe auch die 2.7-Dokumentation nicht noch einmal überprüft , aber ich weiß jetzt, dass Sie korrekt sind.Ich glaube, das Plattformmodul wird wahrscheinlich für neuen Code bevorzugt. Die anderen existierten davor. Es ist eine Evolution, und die anderen bleiben aus Gründen der Abwärtskompatibilität.
quelle