Tôi đang chạy hệ điều hành nào?


Câu trả lời:


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

Đầu ra của platform.system()như sau:

  • Linux: Linux
  • Mac: Darwin
  • Các cửa sổ: Windows

Xem: platform- Truy cập vào dữ liệu nhận dạng của nền tảng cơ bản


26
Tại sao tôi nên thích platformhơn sys.platform?
matth

40
@matth Sản lượng phù hợp hơn một chút. tức là platform.system()trả về "Windows"thay vì "win32". sys.platformcũng chứa "linux2"trên các phiên bản cũ của Python trong khi nó chỉ chứa "linux"các phiên bản mới hơn. platform.system()đã luôn luôn trở lại chỉ "Linux".
erb

4
Trên mac os X, platform.system () luôn trả về "Darwin"? hoặc có trường hợp khác có thể?
baptiste chéné

4
@ baptistechéné, tôi biết điều này đã hơn một năm kể từ khi bạn hỏi, nhưng như một bình luận sẽ không bị tổn thương, tôi sẽ đăng nó bằng mọi cách :) Vì vậy, lý do đằng sau nó là vì nó hiển thị tên kernel. Cùng một cách phân phối Linux (kernel) có nhiều tên (Ubuntu, Arch, Fedora trong số những cái khác), nhưng nó sẽ tự đặt tên là tên kernel, Linux. Darwin (một hạt nhân dựa trên BSD), có hệ thống xung quanh, macOS. Tôi khá chắc chắn rằng apple đã phát hành Darwin dưới dạng mã nguồn mở, nhưng không có bản phân phối nào khác chạy qua Darwin mà tôi biết.
Joao Paulo Rabelo

1
@TooroSan os.uname()chỉ tồn tại cho các hệ thống Unix. Tài liệu Python 3: docs.python.org/3/l Library / os.html Availability: recent flavors of Unix.
Irving Moy

175

Dang - lbrandy đánh bại tôi, nhưng điều đó không có nghĩa là tôi không thể cung cấp cho bạn kết quả hệ thống cho Vista!

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

... và tôi không thể tin rằng chưa có ai đăng một cái cho Windows 10:

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

6
Windows 7:platform.release() '7'
Hugo

3
Vì vậy, yeah, tôi vừa chạy platform.release()trên Windows 10 của tôi , và nó chắc chắn đã cho tôi '8'. Có lẽ tôi đã cài đặt python trước khi nâng cấp, nhưng thực sự ??
Codmith

2
Tôi có thể nghĩ rằng nhiều khả năng bạn đã nâng cấp từ Windows 8 (so với bản cài đặt sạch) và bất cứ điều gì Python tìm kiếm trong sổ đăng ký hoặc bất cứ điều gì bị bỏ lại?
OJFord

2
Tra cứu phát hành cho python trên Windows dường như sử dụng chức năng api Win32 GetVersionEx ở lõi của nó. Các ghi chú ở đầu bài viết này của Microsoft về chức năng đó có thể có liên quan: msdn.microsoft.com/en-us/l
Library / windows / desktop / Lỗi

126

Đối với hồ sơ ở đây, kết quả trên Mac:

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

1
Trên macOS Catalina 10.15.2, platform.release()trả về'19.2.0'
Boris

95

Mã mẫu để phân biệt hệ điều hành bằng 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
Là mã mẫu này từ bất kỳ mô-đun python? Đây là câu trả lời duy nhất mà trên thực tế trả lời câu hỏi.
kon tâm lý

8
Để có kết quả mờ hơn, `` _pl platform.startswith ('linux')
Klaatu von Schlacker

42

Bạn cũng có thể sử dụng sys.platformnếu bạn đã nhập sysvà bạn không muốn nhập mô-đun khác

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

Liệu các phương pháp tiếp cận có bất kỳ lợi thế nào, ngoài việc phải hoặc không nhập mô-đun khác?
matth

Phạm vi là lợi thế chính. Bạn muốn càng ít tên biến toàn cầu càng tốt. Khi bạn đã có "sys" là tên toàn cầu, bạn không nên thêm tên khác. Nhưng nếu bạn chưa sử dụng "sys", sử dụng "_pl platform" có thể mô tả nhiều hơn và ít có khả năng va chạm với ý nghĩa khác.
sanderd17

33

Nếu bạn muốn dữ liệu người dùng có thể đọc được nhưng vẫn chi tiết, bạn có thể sử dụng platform.pl platform ()

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

Đây là một vài cuộc gọi khác nhau mà bạn có thể thực hiện để xác định bạn đang ở đâu

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

Các kết quả đầu ra của tập lệnh này chạy trên một vài hệ thống khác nhau (Linux, Windows, Solaris, MacOS) và kiến ​​trúc (x86, x64, Itanium, power pc, sparc) có sẵn tại đây: https://github.com/hpcugent/easybuild/ wiki / OS_flavor_name_version

Ví dụ, máy chủ Ubuntu 12.04 cung cấp:

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
Boris

19

Truyện ngắn

Sử dụng platform.system(). Nó trả về Windows, Linuxhoặc Darwin(cho OSX).

Câu chuyện dài

Có 3 cách để có được HĐH trong Python, mỗi cách đều có ưu và nhược điểm riêng:

Phương pháp 1

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

Cách thức hoạt động ( nguồn ): Trong nội bộ, nó gọi API hệ điều hành để lấy tên của HĐH theo định nghĩa của HĐH. Xem ở đây để biết các giá trị cụ thể của hệ điều hành.

Pro: Không có phép thuật, cấp độ thấp.

Con: phụ thuộc phiên bản hệ điều hành, vì vậy tốt nhất không sử dụng trực tiếp.

Cách 2

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

Cách thức hoạt động ( nguồn ): Trong nội bộ, nó kiểm tra xem python có các mô-đun dành riêng cho hệ điều hành được gọi là posix hoặc nt.

Pro: Đơn giản để kiểm tra nếu hệ điều hành posix

Con: không có sự khác biệt giữa Linux hoặc OSX.

Phương pháp 3

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

Cách thức hoạt động ( nguồn ): Bên trong, cuối cùng nó sẽ gọi API hệ điều hành nội bộ, lấy tên cụ thể của phiên bản hệ điều hành như 'win32' hoặc 'win16' hoặc 'linux1' và sau đó bình thường hóa thành các tên chung hơn như 'Windows' hoặc 'Linux' hoặc "Darwin" bằng cách áp dụng một số phương pháp phỏng đoán.

Pro: Cách di động tốt nhất cho Windows, OSX và Linux.

Con: Người Python phải tiếp tục bình thường hóa heuristic cho đến nay.

Tóm lược

  • Nếu bạn muốn kiểm tra xem HĐH là Windows hay Linux hay OSX thì cách đáng tin cậy nhất là platform.system().
  • Nếu bạn muốn thực hiện các cuộc gọi dành riêng cho hệ điều hành nhưng thông qua các mô-đun Python tích hợp posixhoặc ntsau đó sử dụng os.name.
  • Nếu bạn muốn lấy tên hệ điều hành thô như được cung cấp bởi chính hệ điều hành thì hãy sử dụng sys.platform.

Quá nhiều cho "Nên có một (và tốt nhất là chỉ có một) cách làm". Tuy nhiên tôi tin rằng đây là câu trả lời đúng. Bạn sẽ cần so sánh với các tên hệ điều hành có tiêu đề nhưng nó không phải là vấn đề như vậy và sẽ dễ mang theo hơn.
vincent-lg

16

Làm thế nào về một câu trả lời mới:

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

Đây sẽ là đầu ra nếu tôi đang sử dụng MACOS


7
psutil không phải là một phần của lib tiêu chuẩn
Corey Goldberg

14

Tôi đã bắt đầu liệt kê một cách có hệ thống hơn một chút về những giá trị bạn có thể mong đợi bằng cách sử dụng các mô-đun khác nhau (thoải mái chỉnh sửa và thêm hệ thống của bạn):

Linux (64 bit) + WSL

os.name                     posix
sys.platform                linux
platform.system()           Linux
sysconfig.get_platform()    linux-x86_64
platform.machine()          x86_64
platform.architecture()     ('64bit', '')
  • đã thử với archlinux và bạc hà, có kết quả tương tự
  • trên python2 sys.platformđược thêm vào bởi phiên bản kernel, vdlinux2 , mọi thứ khác vẫn giữ nguyên
  • cùng một đầu ra trên Hệ thống con Windows cho Linux (đã thử với Ubuntu 18.04 LTS), ngoại trừ platform.architecture() = ('64bit', 'ELF')

Cửa sổ (64 bit)

(với cột 32 bit chạy trong hệ thống con 32 bit)

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

Một số nhận xét:

  • cũng có distutils.util.get_platform() có cái giống hệt với `sysconfig.get_pl platform
  • Anaconda trên windows giống như trình cài đặt windows python chính thức
  • Tôi không có máy Mac cũng như hệ thống 32 bit thực sự và không có động lực để thực hiện trực tuyến

Để so sánh với hệ thống của bạn, chỉ cần chạy tập lệnh này (và vui lòng nối thêm kết quả tại đây nếu thiếu :)

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

Tôi đang sử dụng công cụ WLST đi kèm với weblogic và nó không triển khai gói nền tảng.

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

Ngoài việc vá hệ thống javaos.py (sự cố với os.system () trên windows 2003 với jdk1.5 ) (mà tôi không thể làm được, tôi phải sử dụng weblogic ngoài hộp), đây là những gì tôi sử dụng:

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
Chào mừng bạn đến với SO, ở đây, đây là một cách thực hành tốt để giải thích lý do tại sao nên sử dụng giải pháp của bạn chứ không chỉ là làm thế nào. Điều đó sẽ làm cho câu trả lời của bạn có giá trị hơn và giúp người đọc tiếp tục hiểu rõ hơn về cách bạn thực hiện nó. Tôi cũng đề nghị bạn nên xem Câu hỏi thường gặp của chúng tôi: stackoverflow.com/faq .
ForceMagic

Câu trả lời tốt, thậm chí có thể ngang bằng với câu trả lời ban đầu. Nhưng bạn có thể giải thích tại sao.
vgoff

9

Đối với Jython là cách duy nhất để có được tên os tôi thấy là để kiểm tra os.nametài sản Java (thử với sys, osplatformmô-đun cho Jython 2.5.3 trên 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

Bạn cũng có thể gọi "platform.java_ver ()" để trích xuất thông tin hệ điều hành trong Jython.
DocOc

8

Kết quả thú vị trên windows 8:

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

Chỉnh sửa: Đó là một lỗi


7

Xem ra nếu bạn đang ở trên Windows với Cygwin nơi os.nameposix.

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

6

trong cùng một tĩnh mạch ....

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
Đây là vấn đề nếu bạn ở trên máy Mac vì platform.system () trả về "Darwin" trên máy Mac và "Darwin" .lower ().
Find

is_windows = platform.system (). low (). startedwith ("win") hoặc Sai
Corey Goldberg

6

Nếu bạn không tìm kiếm phiên bản kernel, v.v., nhưng đang tìm bản phân phối linux, bạn có thể muốn sử dụng phần sau

trong 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

trong python2.4

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

Rõ ràng, điều này sẽ chỉ hoạt động nếu bạn đang chạy này trên linux. Nếu bạn muốn có tập lệnh chung hơn trên các nền tảng, bạn có thể kết hợp tập lệnh này với các mẫu mã được đưa ra trong các câu trả lời khác.



4

Kiểm tra các bài kiểm tra có sẵn với nền tảng mô-đun và in câu trả lời cho hệ thống của bạn:

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

Bạn cũng có thể chỉ sử dụng mô-đun nền tảng mà không cần nhập mô-đun os để có được tất cả thông tin.

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

Một bố cục đẹp và gọn gàng cho mục đích báo cáo có thể đạt được bằng cách sử dụng dòng này:

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

Điều đó mang lại đầu ra này:

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

Điều còn thiếu thường là phiên bản hệ điều hành nhưng bạn nên biết nếu bạn đang chạy windows, linux hay mac, một cách phụ thuộc nền tảng là sử dụng thử nghiệm này:

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

4

Tôi biết đây là một câu hỏi cũ nhưng tôi tin rằng câu trả lời của tôi là một câu hỏi có thể hữu ích cho một số người đang tìm kiếm một cách dễ dàng, đơn giản để hiểu pythonic để phát hiện HĐH trong mã của họ. Đã thử nghiệm trên 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

Nếu bạn đang chạy macOS X và chạy, platform.system()bạn sẽ nhận được darwin vì macOS X được xây dựng trên hệ điều hành Darwin của Apple. Darwin là hạt nhân của macOS X và về cơ bản là macOS X không có GUI.


2

Giải pháp này hoạt động cho cả pythonjython.

mô-đun 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>" 

Sử dụng như thế này:

import os_identify

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

1

Làm thế nào về một thực hiện Enum đơn giản như sau? Không cần libs bên ngoài!

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

Đơn giản là bạn có thể truy cập với giá trị Enum

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

PS là python3


1

Bạn có thể xem mã trong pyOSinfođó là một phần của gói pip-date , để có được thông tin hệ điều hành phù hợp nhất, như được thấy từ bản phân phối Python của bạn.

Một trong những lý do phổ biến nhất mà mọi người muốn kiểm tra HĐH của họ là tính tương thích của thiết bị đầu cuối và nếu một số lệnh hệ thống nhất định có sẵn. Thật không may, sự thành công của việc kiểm tra này phần nào phụ thuộc vào cài đặt và hệ điều hành python của bạn. Ví dụ, unamekhông có sẵn trên hầu hết các gói python của Windows. Chương trình python ở trên sẽ cho bạn thấy đầu ra của các hàm dựng sẵn được sử dụng phổ biến nhất, đã được cung cấp bởi os, sys, platform, site.

nhập mô tả hình ảnh ở đây

Vì vậy, cách tốt nhất để chỉ lấy mã thiết yếu là xem đó là một ví dụ. (Tôi đoán rằng tôi có thể vừa dán nó ở đây, nhưng điều đó sẽ không đúng về mặt chính trị.)


1

Tôi đến trễ trò chơi, nhưng trong trường hợp có ai cần nó, đây là chức năng tôi sử dụng để điều chỉnh mã của mình để nó chạy trên Windows, Linux và MacOs:

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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.