Надежно определять Windows в Python

Я работаю над парой инструментов Linux и должен предотвратить установку в Windows, поскольку она зависит от FHS и, таким образом, на этой платформе становится бесполезной. platform.platform Функция подходит близко, но возвращает только строку.

К сожалению, я не знаю, что искать в этой строке, чтобы получить надежный результат. Кто-нибудь знает, что искать, или кто-нибудь знает о другой функции, которую мне здесь не хватает?

6 ответов

Решение
>>> import platform
>>> platform.system()
'Windows'

Для тех, кто пришел сюда в поисках способа обнаружения 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.
Другие вопросы по тегам