На якій ОС я працюю?


Відповіді:


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

Вихід такої platform.system():

  • Linux: Linux
  • Мак: Darwin
  • Windows: Windows

Див.: platform- Доступ до ідентифікаційних даних основної платформи


26
Чому я віддаю перевагу platformнад sys.platform?
матч

40
@matth Трохи послідовніший вихід. тобто platform.system()повертається "Windows"замість "win32". sys.platformтакож міститься "linux2"у старих версіях Python, тоді як він містить лише "linux"новіші. platform.system()завжди повертався просто "Linux".
erb

4
На mac os X, platform.system () завжди повертає "Darwin"? чи можливий інший випадок?
baptiste chéné

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

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 використовує функцію Win32 api 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? Це єдина відповідь, яка насправді відповідає на питання.
kon psych

8
Для нечітких результатів `` _platform.startswith ('linux')
Клаату фон Шлакер

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/ wiki / 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 OS, щоб отримати ім’я ОС, як визначено ОС. Дивіться тут для різних ОС-специфічних значень.

Pro: Ніякої магії, низький рівень.

Con: версія ОС залежить, тому краще не використовувати безпосередньо.

Спосіб 2

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

Як це працює ( джерело ): Внутрішньо він перевіряє, чи python має специфічні для ОС модулі, що називаються posix або nt.

Pro: Проста перевірити, чи є posix OS

Con: немає диференціації між Linux або OSX.

Спосіб 3

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

Як це працює ( джерело ): Внутрішньо він з часом викличе внутрішні API OS, отримає назву, характерну для версії ОС, типу 'win32' або 'win16' або 'linux1', а потім нормалізується на більш загальні назви, такі як 'Windows' або 'Linux' або "Дарвін", застосувавши кілька евристик.

Pro: Найкращий портативний спосіб для Windows, OSX та Linux.

Con: Люди з Python повинні постійно оновлювати евристику нормалізації.

Підсумок

  • Якщо ви хочете перевірити, чи є ОС Windows чи Linux чи OSX, тоді це найнадійніший спосіб platform.system().
  • Якщо ви хочете робити виклики, характерні для ОС, але через вбудовані модулі Python posixабо ntвикористовуйте os.name.
  • Якщо ви хочете отримати необроблене ім’я ОС, яке надається самою ОС, тоді використовуйте sys.platform.

Стільки за "Має бути один (і бажано лише один) спосіб робити речі". Однак я вважаю, що це правильна відповідь. Вам потрібно порівняти з назвами ОС, але вони не є такою проблемою, і вони будуть більш портативними.
vincent-lg

16

Як щодо нової відповіді:

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

Це був би вихід, якби я використовував MACOS


7
psutil не входить до стандартних ліб
Corey Goldberg

14

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

Linux (64bit) + 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
  • anaconda на Windows - це те саме, що офіційний інсталятор windows python
  • У мене немає ні 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 ) (що я не можу зробити, я повинен використовувати веб-журнал поза коробкою), це те, що я використовую:

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
Ласкаво просимо на ТАК, ось, це хороша практика пояснити, чому слід використовувати своє рішення, а не тільки як. Це зробить вашу відповідь більш цінною та допоможе подальшому читачеві краще зрозуміти, як ви це робите. Я також пропоную вам ознайомитися з нашими поширеними питаннями: 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 (). нижня (). startwith ("win") або False
Corey Goldberg

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 Наявність: останні аромати Unix.
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()ви отримуєте дарвін, оскільки macOS X побудований на ОС Дарвіна в Apple. Дарвін є ядром macOS X і по суті є macOS X без GUI.


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який є частиною пакету дати піп , щоб отримати найбільш релевантну інформацію про ОС, як це видно з вашого дистрибутива Python.

Однією з найпоширеніших причин, коли люди хочуть перевірити свою ОС, є сумісність терміналів і наявність певних системних команд. На жаль, успіх цієї перевірки дещо залежить від вашої установки python та ОС. Наприклад, unameнедоступний у більшості пакетів Windows python. Вищенаведена програма 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.