OS apa yang saya jalankan?

Jawaban:

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

Outputnya platform.system()adalah sebagai berikut:

  • Linux: Linux
  • Mac: Darwin
  • Windows: Windows

Lihat: platform- Akses ke data pengenal platform yang mendasarinya

Louis Brandy
sumber
26
Mengapa saya harus memilih platformlebih sys.platform?
matth
40
@ ahth. Output yang sedikit lebih konsisten. yaitu platform.system()mengembalikan "Windows"bukan "win32". sys.platformjuga berisi "linux2"versi lama dari Python sementara itu hanya berisi versi "linux"yang lebih baru. platform.system()selalu kembali saja "Linux".
erb
4
Di mac os X, platform.system () selalu mengembalikan "Darwin"? atau adakah kasus lain yang memungkinkan?
baptiste chéné
4
@ baptistechéné, saya tahu ini sudah lebih dari setahun sejak Anda bertanya, tetapi sebagai komentar tidak ada salahnya, saya akan mempostingnya :) Jadi, alasan di baliknya adalah karena ini menunjukkan nama kernel. Cara yang sama distro Linux (kernel) memiliki banyak nama (Ubuntu, Arch, Fedora antara lain), tetapi itu akan muncul dengan sendirinya sebagai nama kernel, Linux. Darwin (Kernel berbasis BSD), memiliki sistem sekelilingnya, macOS. Saya cukup yakin apel memang melepaskan Darwin sebagai kode sumber terbuka, tetapi tidak ada distro lain yang berjalan di atas Darwin yang saya tahu.
Joao Paulo Rabelo
1
@TooroSan os.uname()hanya ada untuk sistem Unix. Python 3 docs: docs.python.org/3/library/os.html Availability: recent flavors of Unix.
Irving Moy
175

Dang - lbrandy mengalahkan saya, tapi itu tidak berarti saya tidak bisa memberi Anda hasil sistem untuk Vista!

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

... dan saya tidak percaya belum ada yang diposting untuk Windows 10:

>>> import os
>>> os.name
'nt'
>>> import platform
>>> platform.system()
'Windows'
>>> platform.release()
'10'
Joey deVilla
sumber
6
Windows 7:platform.release() '7'
Hugo
3
Jadi, ya, saya hanya menjalankan Windows 10platform.release() saya , dan itu pasti memberi saya . Mungkin saya menginstal python sebelum melakukan upgrade, tapi benarkah ?? '8'
Codesmith
2
Saya akan berpikir itu lebih mungkin Anda upgrade dari Windows 8 (vs itu menjadi instalasi yang bersih) dan apa pun Python mencari di registri atau apa pun yang tertinggal?
OJFord
2
Pencarian rilis untuk python pada Windows tampaknya menggunakan fungsi api Win32 GetVersionEx pada intinya. Catatan di bagian atas artikel Microsoft ini tentang fungsi itu mungkin relevan: msdn.microsoft.com/en-us/library/windows/desktop/…
theferrit32
126

Sebagai catatan, inilah hasilnya di Mac:

>>> import os
>>> os.name
'posix'
>>> import platform
>>> platform.system()
'Darwin'
>>> platform.release()
'8.11.1'
Mark Harrison
sumber
1
Pada macOS Catalina 10.15.2, platform.release()pengembalian'19.2.0'
Boris
95

Kode sampel untuk membedakan OS menggunakan 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
pengguna3928804
sumber
1
Apakah kode sampel ini dari modul python? Ini adalah satu-satunya jawaban yang sebenarnya menjawab pertanyaan itu.
kon psych
8
Untuk hasil yang lebih kabur, `` _platform.startswith ('linux')
Klaatu von Schlacker
42

Anda juga dapat menggunakan sys.platformjika Anda sudah mengimpor sysdan Anda tidak ingin mengimpor modul lain

>>> import sys
>>> sys.platform
'linux2'
Moe
sumber
Apakah salah satu pendekatan memiliki kelebihan, selain harus atau tidak mengimpor modul lain?
matth
Pelingkupan adalah keuntungan utama. Anda ingin sesedikit mungkin nama variabel global. Ketika Anda sudah memiliki "sistem" sebagai nama global, Anda tidak harus menambahkan yang lain. Tetapi jika Anda belum menggunakan "sys", menggunakan "_platform" mungkin lebih deskriptif dan kecil kemungkinannya berbenturan dengan makna lain.
sanderd17
33

Jika Anda ingin data yang dapat dibaca pengguna tetapi masih detail, Anda bisa menggunakannya platform.platform ()

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

Berikut beberapa kemungkinan panggilan yang dapat Anda buat untuk mengidentifikasi di mana Anda berada

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

Output dari skrip ini dijalankan pada beberapa sistem yang berbeda (Linux, Windows, Solaris, MacOS) dan arsitektur (x86, x64, Itanium, power pc, sparc) tersedia di sini: https://github.com/hpcugent/easybuild/ wiki / OS_flavor_name_version

Server Ubuntu 12.04 misalnya memberi:

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: ('', ('', '', ''), '')
Jens Timmerman
sumber
DeprecationWarning: dist() and linux_distribution() functions are deprecated in Python 3.5
Boris
19

Cerita pendek

Gunakan platform.system(). Itu kembali Windows, Linuxatau Darwin(untuk OSX).

Cerita panjang

Ada 3 cara untuk mendapatkan OS di Python, masing-masing dengan pro dan kontra sendiri:

Metode 1

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

Bagaimana ini bekerja ( sumber ): Secara internal ia memanggil OS OS untuk mendapatkan nama OS sebagaimana didefinisikan oleh OS. Lihat di sini untuk berbagai nilai spesifik OS.

Pro: Tidak ada sihir, level rendah.

Con: Tergantung pada versi OS, jadi sebaiknya jangan gunakan secara langsung.

Metode 2

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

Bagaimana ini bekerja ( sumber ): Secara internal ia memeriksa apakah python memiliki modul-modul khusus OS yang disebut posix atau nt.

Pro: Mudah untuk memeriksa apakah posix OS

Con: tidak ada perbedaan antara Linux atau OSX.

Metode 3

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

Bagaimana ini bekerja ( sumber ): Secara internal pada akhirnya akan memanggil API OS internal, mendapatkan nama spesifik versi OS seperti 'win32' atau 'win16' atau 'linux1' dan kemudian menormalkan ke nama-nama yang lebih umum seperti 'Windows' atau 'Linux' atau 'Darwin' dengan menerapkan beberapa heuristik.

Pro: Cara portabel terbaik untuk Windows, OSX dan Linux.

Con: Orang-orang Python harus menjaga heuristik normalisasi tetap up to date.

Ringkasan

  • Jika Anda ingin memeriksa apakah OS adalah Windows atau Linux atau OSX maka cara yang paling dapat diandalkan adalah platform.system() .
  • Jika Anda ingin membuat panggilan khusus OS tetapi melalui modul Python bawaan posixatau ntgunakanos.name .
  • Jika Anda ingin mendapatkan nama OS mentah seperti yang disediakan oleh OS itu sendiri, maka gunakan sys.platform.
Shital Shah
sumber
Begitu banyak untuk "Seharusnya ada satu (dan lebih disukai hanya satu) cara untuk melakukan sesuatu". Namun saya percaya ini adalah jawaban yang tepat. Anda perlu membandingkan dengan nama OS yang diberi judul tetapi itu bukan masalah dan akan lebih portabel.
vincent-lg
16

Bagaimana dengan jawaban baru:

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

Ini akan menjadi output jika saya menggunakan MACOS

whackamadoodle3000
sumber
7
psutil bukan bagian dari lib standar
Corey Goldberg
14

Saya mulai membuat daftar yang lebih sistematis tentang nilai-nilai apa yang dapat Anda harapkan menggunakan berbagai modul (jangan ragu untuk mengedit dan menambahkan sistem Anda):

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', '')
  • mencoba dengan archlinux dan mint, mendapat hasil yang sama
  • pada python2 diakhiri sys.platformdengan versi kernel, mislinux2 , semua yang lain tetap identik
  • keluaran yang sama pada Subsistem Windows untuk Linux (dicoba dengan ubuntu 18.04 LTS), kecuali platform.architecture() = ('64bit', 'ELF')

WINDOWS (64bit)

(dengan kolom 32bit berjalan di subsistem 32bit)

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

Beberapa komentar:

  • ada juga distutils.util.get_platform() yang identik dengan `sysconfig.get_platform
  • anaconda di windows sama dengan installer resmi python windows
  • Saya tidak memiliki Mac atau sistem 32bit yang sebenarnya dan tidak termotivasi untuk melakukannya secara online

Untuk membandingkan dengan sistem Anda, cukup jalankan skrip ini (dan harap tambahkan hasil di sini jika ada :)

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())
perbaikan dingin
sumber
11

Saya menggunakan alat WLST yang datang dengan weblogic, dan itu tidak mengimplementasikan paket platform.

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

Selain menambal sistem javaos.py ( masalah dengan os.system () pada windows 2003 dengan jdk1.5 ) (yang tidak bisa saya lakukan, saya harus menggunakan weblogic out of the box), inilah yang saya gunakan:

def iswindows():
  os = java.lang.System.getProperty( "os.name" )
  return "win" in os.lower()
Alftheo
sumber
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)
urantialife
sumber
3
Selamat datang di SO, di sini, ini adalah praktik yang baik untuk menjelaskan mengapa menggunakan solusi Anda dan bukan hanya bagaimana. Itu akan membuat jawaban Anda lebih berharga dan membantu pembaca lebih lanjut untuk memiliki pemahaman yang lebih baik tentang bagaimana Anda melakukannya. Saya juga menyarankan agar Anda melihat FAQ kami: stackoverflow.com/faq .
ForceMagic
Jawaban yang bagus, bahkan mungkin setara dengan jawaban yang asli. Tapi Anda bisa menjelaskan alasannya.
vgoff
9

Untuk Jython satu-satunya cara untuk mendapatkan nama os yang saya temukan adalah dengan memeriksa os.nameproperti Java (dicoba dengan sys, osdan platformmodul untuk Jython 2.5.3 di 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
Michał Niklas
sumber
Anda juga dapat memanggil "platform.java_ver ()" untuk mengekstrak informasi OS dalam Jython.
DocOc
8

Hasil menarik di windows 8:

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

Sunting: Itu bug

Eric
sumber
7

Hati-hati jika Anda berada di Windows dengan Cygwin mana os.nameadalah posix.

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

dalam nada yang sama ....

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")
Elden
sumber
9
Ini bermasalah jika Anda menggunakan Mac karena platform.system () mengembalikan "Darwin" pada Mac dan "Darwin" .lower (). Find ("win") = 3.
mishaF
is_windows = platform.system (). lower (). startswith ("win") atau False
Corey Goldberg
6

Jika Anda tidak mencari versi kernel dll, tetapi mencari distribusi linux Anda mungkin ingin menggunakan yang berikut ini

di 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

dalam python2.4

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

Jelas, ini hanya akan berfungsi jika Anda menjalankan ini di linux. Jika Anda ingin memiliki lebih banyak skrip generik di seluruh platform, Anda dapat mencampurnya dengan contoh kode yang diberikan dalam jawaban lain.

sunil
sumber
4

Periksa tes yang tersedia dengan platform modul dan cetak jawabannya untuk sistem Anda:

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
Stefan Gruenwald
sumber
4

Anda juga dapat menggunakan hanya modul platform tanpa mengimpor modul os untuk mendapatkan semua informasi.

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

Tata letak yang bagus dan rapi untuk tujuan pelaporan dapat dicapai dengan menggunakan baris ini:

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

Itu memberikan hasil ini:

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

Apa yang hilang biasanya adalah versi sistem operasi tetapi Anda harus tahu jika Anda menjalankan windows, linux atau mac cara platform independen adalah dengan menggunakan tes ini:

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

Saya tahu ini adalah pertanyaan lama tetapi saya percaya bahwa jawaban saya adalah salah satu yang mungkin dapat membantu beberapa orang yang mencari cara pythonic yang mudah dan sederhana untuk mendeteksi OS dalam kode mereka. Diuji pada 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
robmsmt
sumber
2

Jika Anda menjalankan macOS X dan menjalankan platform.system()Anda mendapatkan darwin karena macOS X dibangun di atas OS Darwin milik Apple. Darwin adalah kernel dari macOS X dan pada dasarnya macOS X tanpa GUI.

Alexander Calvert
sumber
2

Solusi ini berfungsi untuk keduanya pythondan jython.

module 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>" 

Gunakan seperti ini:

import os_identify

print "My OS: " + os_identify.name()
hoijui
sumber
1

Bagaimana dengan implementasi Enum sederhana seperti berikut ini? Tidak perlu untuk lib eksternal!

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

Cukup Anda dapat mengakses dengan nilai Enum

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

PS Ini adalah python3

Memin
sumber
1

Anda dapat melihat kode pyOSinfoyang merupakan bagian dari paket pip-date , untuk mendapatkan informasi OS yang paling relevan, seperti yang terlihat dari distribusi Python Anda.

Salah satu alasan paling umum orang ingin memeriksa OS mereka adalah untuk kompatibilitas terminal dan jika perintah sistem tertentu tersedia. Sayangnya, keberhasilan pengecekan ini agak tergantung pada instalasi python dan OS Anda. Misalnya, unametidak tersedia di sebagian besar paket python Windows. Program python di atas akan menunjukkan kepada Anda output dari fungsi built-in yang paling umum digunakan, sudah disediakan oleh os, sys, platform, site.

masukkan deskripsi gambar di sini

Jadi cara terbaik untuk mendapatkan hanya kode penting adalah melihat bahwa sebagai contoh. (Saya kira saya bisa saja menempelkannya di sini, tetapi itu tidak benar secara politis.)

not2qubit
sumber
1

Saya terlambat ke permainan tetapi, kalau-kalau ada yang membutuhkannya, ini fungsi yang saya gunakan untuk membuat penyesuaian pada kode saya sehingga berjalan di Windows, Linux dan 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'
tudor
sumber