Python:我在运行什么操作系统?

Mar*_*son 561 python cross-platform platform-specific

我需要看一下,看看我是在Windows,Unix等吗?

Lou*_*ndy 729

>>> import os
>>> print os.name
posix
>>> import platform
>>> platform.system()
'Linux'
>>> platform.release()
'2.6.22-15-generic'
Run Code Online (Sandbox Code Playgroud)

输出platform.system()如下:

  • Linux的: Linux
  • 苹果电脑: Darwin
  • 视窗: Windows

请参阅:platform - 访问底层平台的标识数据

  • @matth略微更稳定的输出.即`platform.system()`返回`"Windows"`而不是``win32"`.`sys.platform`在旧版本的Python上也包含``linux2``,而在新版本的Python上只包含``linux``.`platform.system()`总是返回``Linux``. (29认同)
  • 为什么我更喜欢`platform`而不是`sys.platform`? (17认同)
  • @baptistechéné,我知道自您提出问题以来已有一年多了,但是作为评论不会有任何伤害,我还是将其张贴:)因此,其背后的原因是因为它显示了内核名称。与Linux(内核)发行版具有许多名称(Ubuntu,Arch,Fedora等)的方式相同,但是它将以内核名称Linux的形式出现。达尔文(基于BSD的内核)具有周围的系统macOS。我敢肯定,苹果确实将Darwin作为开放源代码发布,但是我所知没有其他发行版在Darwin上运行。 (4认同)
  • 在mac os X上,platform.system()总是返回"Darwin"?还是有其他情况可能吗? (3认同)
  • @TooroSan `os.uname()` 仅适用于 Unix 系统。Python 3 文档:https://docs.python.org/3/library/os.html `可用性:Unix 的最新风格。` (2认同)
  • 在 ipad 上,platform.system() 返回“Darwin”,这在某种程度上是正确的。python 库是在 macos 上编译的。但是,sys.platform='ios',其中信息更丰富 (2认同)

Joe*_*lla 168

Dang - lbrandy打败了我,但这并不意味着我无法为你提供Vista的系统效果!

>>> import os
>>> os.name
'nt'
>>> import platform
>>> platform.system()
'Windows'
>>> platform.release()
'Vista'
Run Code Online (Sandbox Code Playgroud)

...我无法相信没有人为Windows 10发布过一个:

>>> import os
>>> os.name
'nt'
>>> import platform
>>> platform.system()
'Windows'
>>> platform.release()
'10'
Run Code Online (Sandbox Code Playgroud)

  • Windows 7:`platform.release()``'7' (5认同)
  • 所以,是的,我刚刚在我的*Windows**10*上运行`platform.release()`,它肯定只给了我''8'.也许我在升级之前安装了python,但是真的? (3认同)
  • 我以为您更有可能从Windows 8升级(而这是全新安装),而注册表中查找的是Python还是遗留了什么? (2认同)
  • Windows上针对python的发行版查找似乎在其核心使用Win32 api函数GetVersionEx。此Microsoft文章顶部有关该功能的注释可能是相关的:https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms724451(v=vs.85).aspx (2认同)

Mar*_*son 122

这里的记录是Mac上的结果:

>>> import os
>>> os.name
'posix'
>>> import platform
>>> platform.system()
'Darwin'
>>> platform.release()
'8.11.1'
Run Code Online (Sandbox Code Playgroud)

  • 在 macOS Catalina 10.15.2 上,“platform.release()”返回“19.2.0” (3认同)
  • `19.2.0` 是 Catalina 10.15.2 附带的 Darwin 发行版本:https://en.wikipedia.org/wiki/MacOS_Catalina#Release_history (2认同)

小智 88

使用python区分OS的示例代码:

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
Run Code Online (Sandbox Code Playgroud)

  • 对于更模糊的结果,``_platform.startswith('linux') (7认同)
  • 哪种怪物使用3个空格作为制表符? (4认同)
  • Windows Cygwin shell 上的 `sys.platform == 'cygwin'` (4认同)
  • 这里看到的原始答案http://stackoverflow.com/a/8220141/3286832 (3认同)
  • 小问题:`win64`不存在:https://github.com/python/cpython/blob/master/Lib/platform.py。所有 Windows 版本都是“win32”。 (2认同)
  • 在我的 windows64 sys.platform 中返回 win32 (2认同)

Moe*_*Moe 39

如果已经导入了sys并且不想导入另一个模块,也可以使用sys.platform

>>> import sys
>>> sys.platform
'linux2'
Run Code Online (Sandbox Code Playgroud)


Jen*_*man 31

如果您想要用户可读数据但仍然详细,可以使用platform.platform()

>>> import platform
>>> platform.platform()
'Linux-3.3.0-8.fc16.x86_64-x86_64-with-fedora-16-Verne'
Run Code Online (Sandbox Code Playgroud)

您可以通过以下几种不同的方式来识别您的身份

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(),
))
Run Code Online (Sandbox Code Playgroud)

此脚本的输出在几个不同的系统(Linux,Windows,Solaris,MacOS)上运行,架构(x86,x64,Itanium,power pc,sparc)可在此处获取:https://github.com/hpcugent/easybuild/维基/ OS_flavor_name_version

  • `DeprecationWarning:dist() 和 linux_distribution() 函数在 Python 3.5 中已弃用` (2认同)

wha*_*000 12

一个新的答案怎么样:

import psutil
psutil.MACOS   #True (OSX is deprecated)
psutil.WINDOWS #False
psutil.LINUX   #False 
Run Code Online (Sandbox Code Playgroud)

如果我使用MACOS,这将是输出

  • psutil不是标准库的一部分 (2认同)

Alf*_*heo 11

我正在使用weblogic附带的WLST工具,它没有实现平台包.

wls:/offline> import os
wls:/offline> print os.name
java 
wls:/offline> import sys
wls:/offline> print sys.platform
'java1.5.0_11'
Run Code Online (Sandbox Code Playgroud)

除了修补系统javaos.py(在Windows 2003上使用jdk1.5的os.system()问题)(我不能这样做,我必须开箱即用weblogic),这就是我使用的:

def iswindows():
  os = java.lang.System.getProperty( "os.name" )
  return "win" in os.lower()
Run Code Online (Sandbox Code Playgroud)


小智 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)
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到SO,在这里,解释为什么要使用您的解决方案而不仅仅是如何解释这是一个很好的做法.这将使您的答案更有价值,并帮助读者更好地了解您的工作方式.我还建议您查看我们的常见问题解答:http://stackoverflow.com/faq. (2认同)

Mic*_*las 9

Jython的获取操作系统名称的唯一途径,我发现是检查os.nameJava属性(试过sys,osplatform模块在WinXP Jython的2.5.3):

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
Run Code Online (Sandbox Code Playgroud)


col*_*fix 9

我开始更系统地列出使用各种模块可以期望得到的值(可以随意编辑和添加系统):

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', '')
Run Code Online (Sandbox Code Playgroud)
  • 尝试使用archlinux和mint,得到相同的结果
  • 在python2上带有sys.platform内核版本的后缀,例如linux2,其他所有内容保持不变
  • 在Linux的Windows子系统上(与ubuntu 18.04 LTS一起尝试)相同的输出,除了 platform.architecture() = ('64bit', 'ELF')

WINDOWS(64位)

(其中32bit列在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')

Run Code Online (Sandbox Code Playgroud)

一些说明:

  • 也有distutils.util.get_platform()和`sysconfig.get_platform
  • Windows上的anaconda与官方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())
Run Code Online (Sandbox Code Playgroud)


Eri*_*ric 7

Windows 8上有趣的结果:

>>> import os
>>> os.name
'nt'
>>> import platform
>>> platform.system()
'Windows'
>>> platform.release()
'post2008Server'
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个错误


fif*_*nce 7

当心,如果你使用的是Windows使用Cygwin哪里os.nameposix.

>>> import os, platform
>>> print os.name
posix
>>> print platform.system()
CYGWIN_NT-6.3-WOW
Run Code Online (Sandbox Code Playgroud)


rob*_*smt 7

我知道这是一个老问题,但我相信我的答案可能对一些正在寻找一种简单易懂的 Pythonic 方法来检测其代码中的操作系统的人有所帮助。在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
Run Code Online (Sandbox Code Playgroud)

  • 如果这段代码被不理解 if 结构的人重构,这可能会导致 Macos 的错误检测,因为“win”包含在“darwin”中。“startswidth”的问题会更少。 (6认同)

Shi*_*hah 6

使用Python获取OS的方法有3种,每种方法各有优缺点:

方法1

>>> import sys
>>> sys.platform
'win32'  # could be 'linux', 'linux2, 'darwin', 'freebsd8' etc
Run Code Online (Sandbox Code Playgroud)

工作原理(来源):内部调用OS API以获取OS定义的OS名称。显然,这可能因版本而异,因此最好不要直接使用。有关各种特定于操作系统的值,请参见此处

方法2

>>> import os
>>> os.name
'nt'  # for Linux and Mac it prints 'posix'
Run Code Online (Sandbox Code Playgroud)

工作原理(来源):内部检查python是否具有称为posix或nt的特定于操作系统的模块。如果要导入这些模块并在其上调用方法,则效果很好。请注意,Linux或OSX之间没有区别。

方法3

>>> import platform
>>> platform.system()
'Windows' # for Linux it prints 'Linux', Mac it prints `'Darwin'
Run Code Online (Sandbox Code Playgroud)

工作原理(来源):内部将最终调用内部OS API,获取特定于操作系统版本的名称,例如“ win32”或“ win16”或“ linux1”,然后将其标准化为更通用的名称,例如“ Windows”或“ Linux”或通过应用几种启发式方法来“达尔文”。这是获取标准化操作系统名称的最佳便携式方法。

摘要

  • 如果要检查OS是Windows还是Linux或OSX,那么最可靠的方法是platform.system()
  • 如果你想OS专用电话,但通过内置的Python模块posixnt再使用os.name
  • 如果要获取OS本身提供的原始OS名称,请使用sys.platform

  • “应该有一种(最好只有一种)做事的方式”就这么多了。但我相信这是正确的答案。您需要与有标题的操作系统名称进行比较,但这不是一个问题,并且会更便携。 (2认同)

Jos*_*ush 6

使用platform.system()

返回系统/操作系统名称,例如“Linux”、“Darwin”、“Java”、“Windows”。如果无法确定值,则返回空字符串。

import platform
system = platform.system().lower()

is_windows = system == 'windows'
is_linux = system == 'linux'
is_mac = system == 'darwin'
Run Code Online (Sandbox Code Playgroud)


小智 5

同样的......

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")
Run Code Online (Sandbox Code Playgroud)

  • 如果你在Mac上,这是有问题的,因为platform.system()在Mac上返回"Darwin",而"Darwin".lower().find("win")= 3. (9认同)

sun*_*nil 5

如果你不是在寻找内核版本等,但是在寻找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
Run Code Online (Sandbox Code Playgroud)

在python2.4中

>>> import platform
>>> print platform.dist()
('centos', '6.0', 'Final')
>>> print platform.dist()[0]
centos
>>> print platform.dist()[1]
6.0
Run Code Online (Sandbox Code Playgroud)

显然,这只有在linux上运行时才有效.如果您希望跨平台使用更多通用脚本,可以将其与其他答案中给出的代码示例混合使用.


小智 5

试试这个:

import os

os.uname()
Run Code Online (Sandbox Code Playgroud)

你可以做到:

info=os.uname()
info[0]
info[1]
Run Code Online (Sandbox Code Playgroud)

  • 此外 `os.uname()` 在 Windows 上不可用:https://docs.python.org/2/library/os.html#os.uname _Availability:**最近的 Unix 版本。**_ (2认同)

G M*_*G M 5

您也可以仅使用platform模块而不导入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')
Run Code Online (Sandbox Code Playgroud)

使用此行可以实现用于报告目的的漂亮整洁的布局:

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

这给出了这个输出:

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

通常操作系统版本会丢失,但你应该知道你运行的是 Windows、Linux 还是 Mac,一种与平台无关的方法是使用此测试:

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
Run Code Online (Sandbox Code Playgroud)