Worauf muss ich achten, um festzustellen, ob ich Windows oder Unix usw. verwende?
Wie erkenne ich, auf welchem Betriebssystem Python läuft?
Markus Harrison
Louis Brandy
>>> import os
>>> os.name
'posix'
>>> import platform
>>> platform.system()
'Linux'
>>> platform.release()
'2.6.22-15-generic'
Die Ausgabe von platform.system()
ist wie folgt:
- Linux:
Linux
- Mac:
Darwin
- Fenster:
Windows
Sehen: platform
— Zugriff auf die Identifizierungsdaten der zugrunde liegenden Plattform
-
Warum sollte ich bevorzugen
platform
Übersys.platform
?– math
7. November 2016 um 14:25 Uhr
-
@matth Etwas konsistentere Ausgabe. dh
platform.system()
kehrt zurück"Windows"
Anstatt von"win32"
.sys.platform
enthält auch"linux2"
auf alten Versionen von Python, während es nur enthält"linux"
auf neueren.platform.system()
ist immer nur zurückgekehrt"Linux"
.– erb
9. Juni 2017 um 10:22 Uhr
-
Unter Mac OS X gibt platform.system() immer “Darwin” zurück? oder ist ein anderer Fall möglich?
– baptiste chéné
12. Januar 2018 um 13:35 Uhr
-
@baptistechéné, ich weiß, dass dies über ein Jahr her ist, seit Sie gefragt haben, aber als Kommentar schadet es nicht, ich werde es trotzdem posten 🙂 Der Grund dafür ist also, dass es den Kernelnamen anzeigt. Auf die gleiche Weise haben Linux (der Kernel)-Distributionen viele Namen (u. a. Ubuntu, Arch, Fedora), aber es wird sich als Kernelname Linux präsentieren. Darwin (ein BSD-basierter Kernel) hat sein umgebendes System, das macOS. Ich bin mir ziemlich sicher, dass Apple Darwin als Open-Source-Code veröffentlicht hat, aber es gibt keine andere mir bekannte Distribution, die über Darwin läuft.
– Joao Paulo Rabelo
30. Januar 2019 um 12:05 Uhr
-
@TooroSan
os.uname()
existiert nur für Unix-Systeme. Die Python 3-Dokumentation: docs.python.org/3/library/os.htmlAvailability: recent flavors of Unix.
– Irving Moy
22. März 2020 um 21:49 Uhr
Joey deVilla
Verdammt — Louis Brandy ist mir zuvorgekommen, aber das heißt nicht, dass ich Ihnen die Systemergebnisse für Vista nicht liefern kann!
>>> import os
>>> os.name
'nt'
>>> import platform
>>> platform.system()
'Windows'
>>> platform.release()
'Vista'
… und ich kann nicht glauben, dass noch niemand eine für Windows 10 gepostet hat:
>>> import os
>>> os.name
'nt'
>>> import platform
>>> platform.system()
'Windows'
>>> platform.release()
'10'
-
Windows 7:
platform.release()
'7'
– Hugo
20. April 2015 um 12:27 Uhr
-
Also, ja, ich bin einfach gerannt
platform.release()
auf meinem Windows 10und es hat mir definitiv gerade gegeben'8'
. Vielleicht habe ich Python vor dem Upgrade installiert, aber wirklich?– Codeschmied
8. Juni 2017 um 13:35 Uhr
-
Ich hätte gedacht, dass es wahrscheinlicher ist, dass Sie von Windows 8 aktualisiert haben (im Gegensatz zu einer Neuinstallation) und was auch immer Python in der Registrierung nachschlägt oder was auch immer zurückgelassen wurde?
– ABl. Ford
30. Januar 2018 um 20:53 Uhr
-
Die Release-Suche für Python unter Windows scheint im Kern die Win32-API-Funktion GetVersionEx zu verwenden. Die Hinweise oben in diesem Microsoft-Artikel zu dieser Funktion könnten relevant sein: msdn.microsoft.com/en-us/library/windows/desktop/…
– der Ferrit32
22. März 2018 um 20:13 Uhr
Markus Harrison
Fürs Protokoll hier die Ergebnisse auf dem Mac:
>>> import os
>>> os.name
'posix'
>>> import platform
>>> platform.system()
'Darwin'
>>> platform.release()
'8.11.1'
-
Unter macOS Catalina 10.15.2,
platform.release()
kehrt zurück'19.2.0'
– Boris Werchowskij
27. Dezember 2019 um 4:55 Uhr
-
19.2.0
ist die Release-Version von Darwin, die mit Catalina 10.15.2 geliefert wird: en.wikipedia.org/wiki/MacOS_Catalina#Release_history– Philshem
21. August 2020 um 13:28 Uhr
Benutzer3928804
Beispielcode zur Unterscheidung von Betriebssystemen mit Python:
import sys
if sys.platform.startswith("linux"): # could be "linux", "linux2", "linux3", ...
# linux
elif sys.platform == "darwin":
# MAC OS X
elif sys.platform == "win32":
# Windows (either 32-bit or 64-bit)
Schital Schah
Kurzgeschichte
Verwenden platform.system()
. Es kehrt zurück Windows
, Linux
oder Darwin
(für OS X).
Lange Geschichte
Es gibt 3 Möglichkeiten, ein Betriebssystem in Python zu erhalten, jede mit ihren eigenen Vor- und Nachteilen:
Methode 1
>>> import sys
>>> sys.platform
'win32' # could be 'linux', 'linux2, 'darwin', 'freebsd8' etc
Wie das funktioniert (Quelle): Intern ruft es Betriebssystem-APIs auf, um den Namen des Betriebssystems zu erhalten, wie durch das Betriebssystem definiert. Siehe hier für verschiedene betriebssystemspezifische Werte.
Pro: Keine Magie, niedriges Level.
Nachteil: Abhängig von der Betriebssystemversion, also am besten nicht direkt verwenden.
Methode 2
>>> import os
>>> os.name
'nt' # for Linux and Mac it prints 'posix'
Wie das funktioniert (Quelle): Intern wird geprüft, ob Python betriebssystemspezifische Module namens posix oder nt hat.
Pro: Einfach zu überprüfen, ob posix OS
Con: keine Unterscheidung zwischen Linux oder OSX.
Methode 3
>>> import platform
>>> platform.system()
'Windows' # for Linux it prints 'Linux', Mac it prints `'Darwin'
Wie das funktioniert (Quelle): Intern ruft es schließlich interne Betriebssystem-APIs auf, erhält einen für die Betriebssystemversion spezifischen Namen wie „win32“ oder „win16“ oder „linux1“ und normalisiert sich dann durch Anwendung auf allgemeinere Namen wie „Windows“ oder „Linux“ oder „Darwin“. mehrere Heuristiken.
Pro: Bester portabler Weg für Windows, OSX und Linux.
Nachteil: Python-Leute müssen die Normalisierungsheuristik auf dem neuesten Stand halten.
Zusammenfassung
- Wenn Sie überprüfen möchten, ob das Betriebssystem Windows oder Linux oder OSX ist, ist dies der zuverlässigste Weg
platform.system()
. - Wenn Sie betriebssystemspezifische Aufrufe durchführen möchten, jedoch über integrierte Python-Module
posix
odernt
dann benutzeos.name
. - Wenn Sie den rohen Betriebssystemnamen erhalten möchten, wie er vom Betriebssystem selbst bereitgestellt wird, verwenden Sie
sys.platform
.
-
So viel zu „Es sollte einen (und am besten nur einen) Weg geben, Dinge zu tun“. Ich glaube jedoch, dass dies die richtige Antwort ist. Sie müssten mit betitelten Betriebssystemnamen vergleichen, aber das ist kein solches Problem und wird portabler sein.
– Vincent-lg
13. April 2020 um 10:00 Uhr
-
Beachten Sie, dass in Python 3.10 ,
platform.system
standardmäßig aufsys.platform
wenn dieos.uname
wirft eine Ausnahme: github.com/python/cpython/blob/…– Heberto Mayorquin
23. August um 15:58 Uhr
Ich habe mit einer etwas systematischeren Auflistung begonnen, welche Werte Sie mit den verschiedenen Modulen erwarten können (Sie können Ihr System gerne bearbeiten und hinzufügen):
Linux (64 Bit) + WSL
x86_64 aarch64
------ -------
os.name posix posix
sys.platform linux linux
platform.system() Linux Linux
sysconfig.get_platform() linux-x86_64 linux-aarch64
platform.machine() x86_64 aarch64
platform.architecture() ('64bit', '') ('64bit', 'ELF')
- versuchte es mit Archlinux und Mint, bekam die gleichen Ergebnisse
- auf python2
sys.platform
wird von der Kernel-Version angehängt, zlinux2
alles andere bleibt gleich - gleiche Ausgabe auf dem Windows-Subsystem für Linux (versucht mit Ubuntu 18.04 LTS), außer
platform.architecture() = ('64bit', 'ELF')
WINDOWS (64bit)
(mit 32-Bit-Spalte, die im 32-Bit-Subsystem ausgeführt wird)
official python installer 64bit 32bit
------------------------- ----- -----
os.name nt nt
sys.platform win32 win32
platform.system() Windows Windows
sysconfig.get_platform() win-amd64 win32
platform.machine() AMD64 AMD64
platform.architecture() ('64bit', 'WindowsPE') ('64bit', 'WindowsPE')
msys2 64bit 32bit
----- ----- -----
os.name posix posix
sys.platform msys msys
platform.system() MSYS_NT-10.0 MSYS_NT-10.0-WOW
sysconfig.get_platform() msys-2.11.2-x86_64 msys-2.11.2-i686
platform.machine() x86_64 i686
platform.architecture() ('64bit', 'WindowsPE') ('32bit', 'WindowsPE')
msys2 mingw-w64-x86_64-python3 mingw-w64-i686-python3
----- ------------------------ ----------------------
os.name nt nt
sys.platform win32 win32
platform.system() Windows Windows
sysconfig.get_platform() mingw mingw
platform.machine() AMD64 AMD64
platform.architecture() ('64bit', 'WindowsPE') ('32bit', 'WindowsPE')
cygwin 64bit 32bit
------ ----- -----
os.name posix posix
sys.platform cygwin cygwin
platform.system() CYGWIN_NT-10.0 CYGWIN_NT-10.0-WOW
sysconfig.get_platform() cygwin-3.0.1-x86_64 cygwin-3.0.1-i686
platform.machine() x86_64 i686
platform.architecture() ('64bit', 'WindowsPE') ('32bit', 'WindowsPE')
Einige Anmerkungen:
- Es gibt auch
distutils.util.get_platform()
was identisch ist mit `sysconfig.get_platform - Anaconda unter Windows ist dasselbe wie das offizielle Python-Windows-Installationsprogramm
- Ich habe weder einen Mac noch ein echtes 32-Bit-System und war nicht motiviert, dies online zu tun
Um es mit Ihrem System zu vergleichen, führen Sie einfach dieses Skript aus (und fügen Sie die Ergebnisse hier an, falls sie fehlen 🙂
from __future__ import print_function
import os
import sys
import platform
import sysconfig
print("os.name ", os.name)
print("sys.platform ", sys.platform)
print("platform.system() ", platform.system())
print("sysconfig.get_platform() ", sysconfig.get_platform())
print("platform.machine() ", platform.machine())
print("platform.architecture() ", platform.architecture())
-
So viel zu „Es sollte einen (und am besten nur einen) Weg geben, Dinge zu tun“. Ich glaube jedoch, dass dies die richtige Antwort ist. Sie müssten mit betitelten Betriebssystemnamen vergleichen, aber das ist kein solches Problem und wird portabler sein.
– Vincent-lg
13. April 2020 um 10:00 Uhr
-
Beachten Sie, dass in Python 3.10 ,
platform.system
standardmäßig aufsys.platform
wenn dieos.uname
wirft eine Ausnahme: github.com/python/cpython/blob/…– Heberto Mayorquin
23. August um 15:58 Uhr
Georgi
Sie können auch verwenden sys.platform
wenn Sie bereits importiert haben sys
und Sie möchten kein weiteres Modul importieren
>>> import sys
>>> sys.platform
'linux2'
-
Hat einer der Ansätze irgendwelche Vorteile, außer dass ein weiteres Modul importiert werden muss oder nicht?
– math
7. November 2016 um 14:41 Uhr
-
Scoping ist der Hauptvorteil. Sie möchten so wenige globale Variablennamen wie möglich. Wenn Sie bereits „sys“ als globalen Namen haben, sollten Sie keinen weiteren hinzufügen. Aber wenn Sie “sys” noch nicht verwenden, ist die Verwendung von “_platform” möglicherweise aussagekräftiger und kollidiert weniger wahrscheinlich mit einer anderen Bedeutung.
– sanderd17
21. Dezember 2016 um 9:01 Uhr
sehen (bugs.python.org/issue12326) für Details!
– Arnkore
18. Januar 2012 um 9:34 Uhr
Hier ist eine verwandte Frage: Überprüfen Sie den Namen der Linux-Distribution.
– hell
8. Dezember 2015 um 19:00 Uhr