O ile wiem, Python ma 3 sposoby sprawdzenia, na jakim systemie operacyjnym działa:
os.name
sys.platform
platform.system()
Znajomość tych informacji jest często przydatna przy importach warunkowych lub przy korzystaniu z funkcji różniących się między platformami (np. W time.clock()
systemie Windows i time.time()
UNIX).
Moje pytanie brzmi: dlaczego 3 różne sposoby to zrobić? Kiedy należy stosować jeden sposób, a nie inny? Który sposób jest „najlepszy” (najbardziej przyszłościowy lub najmniej skłonny do przypadkowego wykluczenia konkretnego systemu, na którym Twój program może faktycznie działać)?
Wydaje się, że sys.platform
jest bardziej szczegółowe niż os.name
umożliwienie odróżnienia win32
od cygwin
(w przeciwieństwie do sprawiedliwego nt
) i linux2
od darwin
(w przeciwieństwie do sprawiedliwego posix
). Ale jeśli tak jest, to co z różnicą między sys.platform
i platform.system()
?
Na przykład, co jest lepsze, to:
import sys
if sys.platform == 'linux2':
# Do Linux-specific stuff
albo to? :
import platform
if platform.system() == 'Linux':
# Do Linux-specific stuff
Na razie będę się trzymał sys.platform
, więc to pytanie nie jest szczególnie pilne, ale byłbym bardzo wdzięczny za wyjaśnienia w tej sprawie.
źródło
sys.platform.startswith('linux')
zamiastsys.platform == 'linux2'
dla przyszłej kompatybilnościOdpowiedzi:
Zanurzyłem się trochę w kodzie źródłowym.
Dane wyjściowe
sys.platform
ios.name
są określane w czasie kompilacji.platform.system()
określa typ systemu w czasie wykonywania.sys.platform
jest określony jako zdefiniowany przez kompilator podczas konfiguracji kompilacji.os.name
Sprawdza, czy moduły konkretnych pewien OS są dostępne (npposix
,nt
...)platform.system()
faktycznie działauname
i potencjalnie kilka innych funkcji do określenia typu systemu w czasie wykonywania.Moja sugestia:
os.name
do sprawdzania, czy jest to system zgodny z POSIX.sys.platform
aby sprawdzić, czy jest to linux, cygwin, darwin, atheos itp.platform.system()
jeśli nie wierzysz innym źródłom.źródło
Istnieje cienka linia różnicy między
platform.system()
isys.platform
i, co ciekawe, w większości przypadkówplatform.system()
degeneruje sięsys.platform
Oto, co
Python2.7\Lib\Platform.py\system
mówi ŹródłoRównież zgodnie z dokumentacją
źródło
Z
sys.platform
dokumentów :os.name
ma grubszą ziarnistośćos.uname()
podaje informacje o wersji zależne od systemuplatform
Moduł zawiera szczegółowe kontrole tożsamości systemuCzęsto „najlepszym” przyszłościowym sposobem sprawdzenia, czy niektóre funkcje są dostępne, jest po prostu próba ich użycia i skorzystanie z rozwiązania awaryjnego, jeśli się nie powiedzie.
platform.system()
zwraca wartość znormalizowaną, że może uzyskać z kilku źródeł:os.uname()
,sys.platform
,ver
polecenia (w systemie Windows).źródło
Zależy to od tego, czy wolisz zgłaszać wyjątki, czy próbować czegokolwiek na niesprawdzonym systemie i czy Twój kod jest tak wysoki lub tak niski, że może lub nie może działać na podobnym, nieprzetestowanym systemie (np. Niesprawdzony Mac - „posix” lub na wbudowane systemy ARM). Bardziej pythoniczne jest nie wyliczenie wszystkich znanych systemów, ale przetestowanie możliwych odpowiednich właściwości. (np. uważa się za ważny endianness systemu, ale nieważne właściwości wieloprocesowe).
os.name jest wystarczającą rozdzielczością do prawidłowego korzystania z
os
modułu. Możliwe wartości to „posix”, „nt”, „os2”, „ce”, „java” lub „riscos” w Pythonie 2.7, podczas gdy od Pythona 3.4 używane są tylko „posix”, „nt” i „java”.sys.platform to lepsza rozdzielczość. Zalecane jest użycie
if sys.platform.startswith('linux')
idiomu, ponieważ „linux2” oznacza jądro Linuksa w wersji 2.xx lub 3. Starsze jądra nigdy nie są używane. W Pythonie 3.3 wszystkie systemy Linux są prostymi linuxami.Nie znam specyfiki systemów "Mac" i "Java" i dlatego nie mogę wykorzystać wyników bardzo dobrej metody platform.system () do rozgałęziania, ale wykorzystałbym zalety
platform
modułu do komunikatów i logowania błędów.źródło
os.name
Dopuszczalne wartości powrotne'posix'
,'nt'
,'java'
według Pythonie 3 Dokumenty . Zobacz też: dokumentacja modułu platformy . Ja nie wierzę'riscos'
i'os2
"Możliwe są następujące wartości zwracane zos.name
; mogą to być wartości zwracane zsys.platform
. Python 3sys.platform
dokumentacja wydaje się nie być wyczerpująca.os.name
jest spójne we wszystkich wersjach. Nie sprawdziłem również dwukrotnie dokumentacji 2.7 , ale teraz wiem, że masz rację.Uważam, że moduł platformy jest prawdopodobnie preferowany dla nowego kodu. Inni istnieli wcześniej. Jest to ewolucja, a pozostałe pozostają kompatybilne wstecz.
źródło