Насколько мне известно, у Python есть 3 способа узнать, на какой операционной системе работает:
os.name
sys.platform
platform.system()
Знание этой информации часто бывает полезно при условном импорте или использовании функций, которые различаются между платформами (например, time.clock()
в Windows и time.time()
UNIX).
У меня вопрос: почему это можно сделать тремя разными способами? Когда следует использовать один способ, а не другой? Какой способ является «наилучшим» (наиболее перспективным или с наименьшей вероятностью случайно исключить конкретную систему, на которой действительно может работать ваша программа)?
Кажется, что sys.platform
это более конкретный, чем os.name
, позволяющий отличать win32
от cygwin
(в отличие от просто nt
) и linux2
от darwin
(в отличие от просто posix
). Но если это так, то как насчет разницы между sys.platform
и platform.system()
?
Например, что лучше, это:
import sys
if sys.platform == 'linux2':
# Do Linux-specific stuff
или это? :
import platform
if platform.system() == 'Linux':
# Do Linux-specific stuff
Пока я буду придерживаться этого sys.platform
, так что этот вопрос не особенно актуален, но я был бы очень благодарен за некоторые разъяснения по этому поводу.
источник
sys.platform.startswith('linux')
вместоsys.platform == 'linux2'
для будущей совместимостиОтветы:
Немного погрузился в исходный код.
Вывод
sys.platform
иos.name
определяется во время компиляции.platform.system()
определяет тип системы во время выполнения.sys.platform
указывается в качестве определения компилятора во время конфигурации сборки.os.name
проверяет , будет ли конкретные модули определенных бя доступны (напримерposix
,nt
...)platform.system()
фактически запускаетсяuname
и, возможно, несколько других функций для определения типа системы во время выполнения.Мое предложение:
os.name
чтобы проверить, совместима ли это система с posix.sys.platform
чтобы проверить, является ли это linux, cygwin, darwin, atheos и т. Д.platform.system()
если не верите другим источникам.источник
Между и есть тонкая грань,
platform.system()
и, чтоsys.platform
интересно, в большинстве случаевplatform.system()
вырождается вsys.platform
Вот что
Python2.7\Lib\Platform.py\system
говорит ИсточникТакже в документации
источник
Из
sys.platform
документов :os.name
имеет более грубую детализациюos.uname()
дает системно-зависимую информацию о версииplatform
Модуль содержит подробные проверки идентичности системыЧасто «лучший» ориентированный на будущее способ проверить, доступна ли какая-либо функция, - это просто попытаться использовать ее и использовать запасной вариант, если он не работает.
platform.system()
возвращает нормализованное значение , что он может получить из нескольких источников:os.uname()
,sys.platform
,ver
команда (на Windows).источник
Это зависит от того, предпочитаете ли вы создавать исключение или пробовать что-либо в непроверенной системе, и является ли ваш код настолько высоким или таким низким, что он может или не может работать в аналогичной непроверенной системе (например, непроверенный Mac - 'posix' или на встроенные системы ARM). Более питоническим является не перечисление всех известных систем, а проверка возможных соответствующих свойств. (например, считается важным порядок байтов системы, но не важны свойства многопроцессорности.)
os.name - достаточное разрешение для правильного использования
os
модуля. Возможные значения: posix, nt, os2, ce, java или riscos в Python 2.7, в то время как с Python 3.4 используются только posix, nt и java.sys.platform - более точное разрешение. Рекомендуется использовать
if sys.platform.startswith('linux')
идиому, потому что «linux2» означает ядро Linux версии 2.xx или 3. Старые ядра в настоящее время никогда не используются. В Python 3.3 все системы Linux являются простыми «linux».Я не знаю специфики систем «Mac» и «Java», поэтому я не могу использовать результаты очень хорошего метода platform.system () для ветвления, но я бы использовал преимущества
platform
модуля для сообщений и регистрации ошибок.источник
os.name
Возможные возвращаемые значения'posix'
,'nt'
, в'java'
соответствии с Python 3 Docs . См. Также: документацию модуля платформы . Я не верю'riscos'
и'os2
'возможны возвращаемые значения изos.name
; они могут быть возвращаемыми значениями изsys.platform
. Python 3sys.platform
документация не представляется исчерпывающим.os.name
было одинаковым для разных версий. Я также не перепроверил документацию 2.7 , но теперь я знаю, что вы правы.Я считаю, что модуль платформы, вероятно, предпочтительнее для нового кода. Остальные существовали до этого. Это эволюция, а остальные остаются для обратной совместимости.
источник