Надежно определять Windows в Python
Я работаю над парой инструментов Linux и должен предотвратить установку в Windows, поскольку она зависит от FHS и, таким образом, на этой платформе становится бесполезной. platform.platform
Функция подходит близко, но возвращает только строку.
К сожалению, я не знаю, что искать в этой строке, чтобы получить надежный результат. Кто-нибудь знает, что искать, или кто-нибудь знает о другой функции, которую мне здесь не хватает?
6 ответов
Для тех, кто пришел сюда в поисках способа обнаружения Cygwin из Python (в отличие от простого обнаружения Windows), вот несколько примеров возвращаемых значений из os.name
а также platform.system
на разных платформах
OS/build | os.name | platform.system()
-------------+---------+-----------------------
Win32 native | nt | Windows
Win32 cygwin | posix | CYGWIN_NT-5.1*
Win64 native | nt | Windows
Win64 cygwin | posix | CYGWIN_NT-6.1-WOW64*
Linux | posix | Linux
С этого момента, как отличить нативную Windows от Cygwin, должно быть очевидно, хотя я не уверен, что это доказательство будущего.
* номера версий для XP и Win7 соответственно, не полагайтесь на них
На моей коробке Windows, platform.system()
возвращается 'Windows'
,
Тем не менее, я не уверен, почему вы беспокоитесь. Если вы хотите ограничить платформу, на которой он работает технологически, я бы использовал белый, а не черный список.
На самом деле, я бы не стал делать это технологически, так как, возможно, следующий выпуск Python может иметь Win32/Win64
вместо Windows
(для черного списка) и *nix
вместо Linux
(для белого списка).
Мой совет состоит в том, чтобы просто указать, каковы требования, и, если пользователь решит игнорировать это, это их проблема. Если они звонят, говоря, что получили сообщение об ошибке "Не удается найти FHS", и они признают, что работают под Windows, осторожно указывайте им, что это не поддерживаемая конфигурация.
Возможно, ваши клиенты достаточно умны, чтобы запустить FHS под Windows, чтобы ваш код работал. Они вряд ли оценят то, что они тогда считают произвольным ограничением вашего программного обеспечения.
С этой проблемой сталкиваются разработчики программного обеспечения каждый день. Даже огромные организации не могут поддерживать каждую платформу и конфигурацию.
>>> import os
>>> os.name
'nt'
"Имя импортированного зависимого модуля операционной системы. В настоящее время зарегистрированы следующие имена:" posix "," nt "," mac "," os2 "," ce "," java "," riscos "." (c) http://docs.python.org/library/os.html
import os
if os.name == 'nt':
#yourcodehere
Попробуй это:
import platform
if platform.system() == "Darwin":
# Don't have Windows handy, but I'd expect "Win32" or "Windows" for it
Редактировать: только что видел, что вы пытались platform.platform()
...platform.system()
будет работать лучше для этого случая. Поверь мне, используй это. Темные углы лежат в платформе обнаружения.
distutils
сделаю это тоже, если вы спросите это приятно.
Вы всегда можете сделать что-то плохое, как os.path.exists()
на файл Windows... но platform
так же надежен, как и в стандартной библиотеке Python.
Редактировать 2: Другой полезный ответчик указал platform.system()
точно соответствует "Windows" на его машине Windows.
С помощью (платформа)
system()
Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'.
An empty string is returned if the value cannot be determined.