На какой ОС я работаю?


625

Что мне нужно посмотреть, чтобы увидеть, нахожусь ли я на Windows или Unix и т. Д.?


2
смотрите ( bugs.python.org/issue12326 ) для деталей!
arnkore

Ответы:


827
>>> import os
>>> os.name
'posix'
>>> import platform
>>> platform.system()
'Linux'
>>> platform.release()
'2.6.22-15-generic'

Вывод platform.system()следующий:

  • Linux: Linux
  • Mac: Darwin
  • Окна: Windows

Смотрите: platform- Доступ к данным идентификации базовой платформы


26
Почему я должен предпочесть platformболее sys.platform?
Матф

40
@matth Чуть более последовательный вывод. т.е. platform.system()возвращается "Windows"вместо "win32". sys.platformтакже содержится "linux2"на старых версиях Python, в то время как он содержит только "linux"на более новых. platform.system()всегда вернулся только что "Linux".
Эрб

4
На Mac OS X platform.system () всегда возвращает «Дарвин»? или возможен другой случай?
Баптист Шене

4
@ baptistechéné, я знаю, что прошло уже больше года с тех пор, как вы спросили, но поскольку комментарий не повредит, я все равно его опубликую :) Итак, причина в том, что он показывает имя ядра. Точно так же, как дистрибутивы Linux (ядра) имеют много имен (Ubuntu, Arch, Fedora и др.), Но они будут отображаться как имя ядра, Linux. Дарвин (ядро на основе BSD) имеет свою систему macOS. Я уверен, что Apple выпустила Darwin как открытый исходный код, но нет другого дистрибутива, работающего над Darwin, о котором я знаю.
Жоао Пауло

1
@TooroSan os.uname()существует только для систем Unix. Документы Python 3: docs.python.org/3/library/os.html Availability: recent flavors of Unix.
Ирвинг Мой

175

Черт - Бренди победил меня, но это не значит, что я не могу предоставить вам результаты системы для Vista!

>>> import os
>>> os.name
'nt'
>>> import platform
>>> platform.system()
'Windows'
>>> platform.release()
'Vista'

... и я не могу поверить, что никто еще не опубликовал для Windows 10:

>>> import os
>>> os.name
'nt'
>>> import platform
>>> platform.system()
'Windows'
>>> platform.release()
'10'

6
Windows 7:platform.release() '7'
Гюго,

3
Так что, да, я просто запустил platform.release()свою Windows 10 , и она определенно просто дала мне '8'. Может быть, я установил Python перед обновлением, но на самом деле ??
Кодесмит

2
Я бы подумал, что более вероятно, что вы обновили Windows 8 (в отличие от чистой установки) и что бы Python ни искал в реестре или что там осталось?
OJFord

2
Похоже, что в выпуске python для Windows используется API-функция Win32 GetVersionEx. Примечания в верхней части этой статьи Microsoft об этой функции могут быть актуальны: msdn.microsoft.com/en-us/library/windows/desktop/…
theferrit32

126

Для записи вот результаты на Mac:

>>> import os
>>> os.name
'posix'
>>> import platform
>>> platform.system()
'Darwin'
>>> platform.release()
'8.11.1'

1
На macOS Каталина 10.15.2, platform.release()возвращает'19.2.0'
Борис

95

Пример кода для разграничения ОС, использующих python:

from sys import platform as _platform

if _platform == "linux" or _platform == "linux2":
    # linux
elif _platform == "darwin":
    # MAC OS X
elif _platform == "win32":
    # Windows
elif _platform == "win64":
    # Windows 64-bit

1
Это пример кода из любого модуля Python? Это единственный ответ, который фактически отвечает на вопрос.
Кон Псих

8
Для нечетких результатов: `` _platform.startswith ('linux') "
Klaatu von Schlacker

42

Вы также можете использовать, sys.platformесли вы уже импортировали, sysи вы не хотите импортировать другой модуль

>>> import sys
>>> sys.platform
'linux2'

Есть ли у одного из подходов какие-либо преимущества, помимо необходимости импортировать другой модуль или нет?
Матф

Скоупинг - главное преимущество. Вы хотите как можно меньше имен глобальных переменных. Если у вас уже есть «sys» в качестве глобального имени, вы не должны добавлять другое. Но если вы еще не используете «sys», использование «_platform» может быть более наглядным и с меньшей вероятностью вступит в противоречие с другим значением.
sanderd17

33

Если вы хотите, чтобы данные читались пользователем, но все еще были подробными, вы можете использовать platform.platform ()

>>> import platform
>>> platform.platform()
'Linux-3.3.0-8.fc16.x86_64-x86_64-with-fedora-16-Verne'

Вот несколько возможных звонков, которые вы можете сделать, чтобы определить, где вы находитесь

import platform
import sys

def linux_distribution():
  try:
    return platform.linux_distribution()
  except:
    return "N/A"

print("""Python version: %s
dist: %s
linux_distribution: %s
system: %s
machine: %s
platform: %s
uname: %s
version: %s
mac_ver: %s
""" % (
sys.version.split('\n'),
str(platform.dist()),
linux_distribution(),
platform.system(),
platform.machine(),
platform.platform(),
platform.uname(),
platform.version(),
platform.mac_ver(),
))

Выходные данные этого скрипта работали на нескольких разных системах (Linux, Windows, Solaris, MacOS), а архитектуры (x86, x64, Itanium, power pc, sparc) доступны здесь: https://github.com/hpcugent/easybuild/ вики / OS_flavor_name_version

Сервер Ubuntu 12.04, например, дает:

Python version: ['2.6.5 (r265:79063, Oct  1 2012, 22:04:36) ', '[GCC 4.4.3]']
dist: ('Ubuntu', '10.04', 'lucid')
linux_distribution: ('Ubuntu', '10.04', 'lucid')
system: Linux
machine: x86_64
platform: Linux-2.6.32-32-server-x86_64-with-Ubuntu-10.04-lucid
uname: ('Linux', 'xxx', '2.6.32-32-server', '#62-Ubuntu SMP Wed Apr 20 22:07:43 UTC 2011', 'x86_64', '')
version: #62-Ubuntu SMP Wed Apr 20 22:07:43 UTC 2011
mac_ver: ('', ('', '', ''), '')

DeprecationWarning: dist() and linux_distribution() functions are deprecated in Python 3.5
Борис

19

Короткий рассказ

Использование platform.system(). Она возвращает Windows, Linuxили Darwin(для OSX).

Длинная история

Есть 3 способа получить ОС в Python, каждый со своими плюсами и минусами:

Способ 1

>>> import sys
>>> sys.platform
'win32'  # could be 'linux', 'linux2, 'darwin', 'freebsd8' etc

Как это работает ( источник ): Внутренне он вызывает API-интерфейсы ОС, чтобы получить имя ОС в соответствии с определением ОС. Смотрите здесь для различных значений ОС.

Pro: Нет магии, низкий уровень.

Против: зависит от версии ОС, поэтому лучше не использовать напрямую.

Способ 2

>>> import os
>>> os.name
'nt'  # for Linux and Mac it prints 'posix'

Как это работает ( источник ): Внутренне он проверяет, есть ли в python модули для ОС, называемые posix или nt.

Pro: просто проверить, работает ли posix OS

Против: нет различий между Linux и OSX.

Способ 3

>>> import platform
>>> platform.system()
'Windows' # for Linux it prints 'Linux', Mac it prints `'Darwin'

Как это работает ( источник ): Внутренне он в конечном итоге вызовет внутренние API-интерфейсы ОС, получит имя для конкретной версии ОС, такое как «win32» или «win16» или «linux1», а затем нормализуется к более общим именам, таким как «Windows» или «Linux», или «Дарвин», применяя несколько эвристик.

Pro: Лучший портативный способ для Windows, OSX и Linux.

Против: Python люди должны поддерживать эвристику нормализации в актуальном состоянии.

Резюме

  • Если вы хотите проверить, является ли ОС Windows, Linux или OSX, то самый надежный способ platform.system().
  • Если вы хотите делать специфичные для ОС вызовы, но через встроенные модули Python posixили ntзатем использоватьos.name .
  • Если вы хотите получить необработанное имя ОС, как указано самой ОС, используйте sys.platform.

Так много для «Должен быть один (и желательно только один) способ сделать что-то». Однако я считаю, что это правильный ответ. Вам нужно сравнить с названными именами ОС, но это не такая проблема, и она будет более переносимой.
Винсент-LG

16

Как насчет нового ответа:

import psutil
psutil.MACOS   #True (OSX is deprecated)
psutil.WINDOWS #False
psutil.LINUX   #False 

Это был бы вывод, если бы я использовал MACOS


7
psutil не является частью стандартной библиотеки
Кори Голдберг,

14

Я начал более систематический список значений, которые вы можете ожидать, используя различные модули (не стесняйтесь редактировать и добавлять свою систему):

Linux (64 бит) + WSL

os.name                     posix
sys.platform                linux
platform.system()           Linux
sysconfig.get_platform()    linux-x86_64
platform.machine()          x86_64
platform.architecture()     ('64bit', '')
  • пробовал с archlinux и mint, получил те же результаты
  • на python2 добавляется sys.platformверсия ядра, например linux2, все остальное остается идентичным
  • тот же вывод в подсистеме Windows для Linux (пробовал с Ubuntu 18.04 LTS), кроме platform.architecture() = ('64bit', 'ELF')

ОКНА (64 бит)

(с 32-битным столбцом в 32-битной подсистеме)

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')

Некоторые замечания:

  • есть также то, distutils.util.get_platform()что идентично `sysconfig.get_platform
  • Анаконда на Windows такая же, как официальный установщик Python для Windows
  • У меня нет ни Mac, ни настоящей 32-битной системы, и я не был мотивирован сделать это онлайн

Чтобы сравнить с вашей системой, просто запустите этот скрипт (и, пожалуйста, добавьте результаты здесь, если не хватает :)

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())

11

Я использую инструмент WLST, который поставляется с weblogic, и он не реализует пакет платформы.

wls:/offline> import os
wls:/offline> print os.name
java 
wls:/offline> import sys
wls:/offline> print sys.platform
'java1.5.0_11'

Помимо исправления системы javaos.py ( проблема с os.system () в Windows 2003 с jdk1.5 ) (что я не могу сделать, я должен использовать weblogic из коробки), это то, что я использую:

def iswindows():
  os = java.lang.System.getProperty( "os.name" )
  return "win" in os.lower()

9

/usr/bin/python3.2

def cls():
    from subprocess import call
    from platform import system

    os = system()
    if os == 'Linux':
        call('clear', shell = True)
    elif os == 'Windows':
        call('cls', shell = True)

3
Добро пожаловать на SO, здесь хорошая практика, чтобы объяснить, почему использовать ваше решение, а не просто как. Это сделает ваш ответ более ценным и поможет читателю лучше понять, как вы это делаете. Я также предлагаю вам посмотреть наш FAQ: stackoverflow.com/faq .
ForceMagic

Хороший ответ, может быть, даже наравне с оригинальным ответом. Но вы могли бы объяснить, почему.
vgoff

9

Для Jython единственный способ получить имя Os я нашел это проверить os.nameJava свойство (пробовал с sys, osи platformмодули для Jython 2.5.3 на WinXP):

def get_os_platform():
    """return platform name, but for Jython it uses os.name Java property"""
    ver = sys.platform.lower()
    if ver.startswith('java'):
        import java.lang
        ver = java.lang.System.getProperty("os.name").lower()
    print('platform: %s' % (ver))
    return ver

Вы также можете вызвать «platform.java_ver ()» для извлечения информации об ОС в Jython.
DocOc

8

Интересные результаты на Windows 8:

>>> import os
>>> os.name
'nt'
>>> import platform
>>> platform.system()
'Windows'
>>> platform.release()
'post2008Server'

Изменить: это ошибка


7

Смотрите, если вы на Windows , с Cygwin , где os.nameнаходится posix.

>>> import os, platform
>>> print os.name
posix
>>> print platform.system()
CYGWIN_NT-6.3-WOW

6

в том же духе....

import platform
is_windows=(platform.system().lower().find("win") > -1)

if(is_windows): lv_dll=LV_dll("my_so_dll.dll")
else:           lv_dll=LV_dll("./my_so_dll.so")

9
Это проблематично, если вы работаете на Mac, так как platform.system () возвращает «Darwin» на Mac и «Darwin» .lower (). Find ("win") = 3.
mishaF

is_windows = platform.system (). lower (). setswith ("победа") или False
Кори Голдберг

6

Если вы не ищете версию ядра и т. Д., Но ищете дистрибутив Linux, вы можете использовать следующее

в python2.6 +

>>> import platform
>>> print platform.linux_distribution()
('CentOS Linux', '6.0', 'Final')
>>> print platform.linux_distribution()[0]
CentOS Linux
>>> print platform.linux_distribution()[1]
6.0

в python2.4

>>> import platform
>>> print platform.dist()
('centos', '6.0', 'Final')
>>> print platform.dist()[0]
centos
>>> print platform.dist()[1]
6.0

Очевидно, это будет работать, только если вы запускаете это на Linux. Если вы хотите иметь более общий сценарий на разных платформах, вы можете смешать его с примерами кода, приведенными в других ответах.


5

попробуй это:

import os

os.uname()

и вы можете сделать это:

info=os.uname()
info[0]
info[1]

1
Также os.uname()недоступно в Windows: docs.python.org/2/library/os.html#os.uname Наличие: последние
ccpizza

4

Проверьте доступные тесты с модульной платформой и распечатайте ответ для вашей системы:

import platform

print dir(platform)

for x in dir(platform):
    if x[0].isalnum():
        try:
            result = getattr(platform, x)()
            print "platform."+x+": "+result
        except TypeError:
            continue

4

Вы также можете использовать только модуль платформы без импорта модуля OS для получения всей информации.

>>> import platform
>>> platform.os.name
'posix'
>>> platform.uname()
('Darwin', 'mainframe.local', '15.3.0', 'Darwin Kernel Version 15.3.0: Thu Dec 10 18:40:58 PST 2015; root:xnu-3248.30.4~1/RELEASE_X86_64', 'x86_64', 'i386')

Хорошая и аккуратная компоновка для целей отчетности может быть достигнута с помощью этой строки:

for i in zip(['system','node','release','version','machine','processor'],platform.uname()):print i[0],':',i[1]

Это дает такой вывод:

system : Darwin
node : mainframe.local
release : 15.3.0
version : Darwin Kernel Version 15.3.0: Thu Dec 10 18:40:58 PST 2015; root:xnu-3248.30.4~1/RELEASE_X86_64
machine : x86_64
processor : i386

Чего обычно не хватает, так это версии операционной системы, но вы должны знать, используете ли вы windows, linux или mac, независимо от платформы, используйте этот тест:

In []: for i in [platform.linux_distribution(),platform.mac_ver(),platform.win32_ver()]:
   ....:     if i[0]:
   ....:         print 'Version: ',i[0]

4

Я знаю, что это старый вопрос, но я считаю, что мой ответ может быть полезен для некоторых людей, которые ищут простой и понятный способ понимания ОС в своем коде. Проверено на python3.7

from sys import platform


class UnsupportedPlatform(Exception):
    pass


if "linux" in platform:
    print("linux")
elif "darwin" in platform:
    print("mac")
elif "win" in platform:
    print("windows")
else:
    raise UnsupportedPlatform

2

Если вы используете MacOS X и запускаете, platform.system()вы получаете darwin, потому что macOS X построен на Apple Darwin OS. Darwin является ядром macOS X и по сути является macOS X без графического интерфейса.


2

Это решение работает как для, так pythonи для jython.

модуль os_identify.py :

import platform
import os

# This module contains functions to determine the basic type of
# OS we are running on.
# Contrary to the functions in the `os` and `platform` modules,
# these allow to identify the actual basic OS,
# no matter whether running on the `python` or `jython` interpreter.

def is_linux():
    try:
        platform.linux_distribution()
        return True
    except:
        return False

def is_windows():
    try:
        platform.win32_ver()
        return True
    except:
        return False

def is_mac():
    try:
        platform.mac_ver()
        return True
    except:
        return False

def name():
    if is_linux():
        return "Linux"
    elif is_windows():
        return "Windows"
    elif is_mac():
        return "Mac"
    else:
        return "<unknown>" 

Используйте как это:

import os_identify

print "My OS: " + os_identify.name()

1

Как насчет простой реализации Enum, подобной следующей? Нет необходимости во внешних библиотеках!

import platform
from enum import Enum
class OS(Enum):
    def checkPlatform(osName):
        return osName.lower()== platform.system().lower()

    MAC = checkPlatform("darwin")
    LINUX = checkPlatform("linux")
    WINDOWS = checkPlatform("windows")  #I haven't test this one

Просто вы можете получить доступ с помощью значения Enum

if OS.LINUX.value:
    print("Cool it is Linux")

PS это python3


1

Вы можете посмотреть на код, pyOSinfoкоторый входит в пакет pip-date , чтобы получить наиболее актуальную информацию об ОС, как видно из вашего дистрибутива Python.

Одна из наиболее распространенных причин, по которой люди хотят проверить свою ОС, - совместимость терминала и наличие определенных системных команд. К сожалению, успех этой проверки в некоторой степени зависит от вашей установки на Python и ОС. Например, unameнедоступно в большинстве пакетов Python для Windows. Вышеприведенная программа на python покажет вывод наиболее часто используемых встроенных функций, уже предоставленных os, sys, platform, site.

введите описание изображения здесь

Так что лучший способ получить только необходимый код - это в качестве примера. (Думаю, я мог бы просто вставить это здесь, но это не было бы политкорректно.)


1

Я опаздываю к игре, но, на всякий случай, кому-то это нужно, эту функцию я использую для корректировки своего кода, чтобы он работал на Windows, Linux и MacO:

import sys
def get_os(osoptions={'linux':'linux','Windows':'win','macos':'darwin'}):
    '''
    get OS to allow code specifics
    '''   
    opsys = [k for k in osoptions.keys() if sys.platform.lower().find(osoptions[k].lower()) != -1]
    try:
        return opsys[0]
    except:
        return 'unknown_OS'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.