如何在Python中检查是否在Windows上运行?

328

我发现了 platform 模块,但它返回的是 'Windows',而在我的计算机上却返回 'Microsoft'。我注意到在 stackoverflow 上的另一个帖子中,它有时会返回 'Vista'。

那么问题来了,我该怎么实现?

if is_windows():
  ...
以向前兼容的方式?如果我必须检查像“Vista”这样的东西,那么当下一个版本的Windows发布时它就会出错。
注意:声称这是重复问题的答案实际上没有回答问题“is_windows”。它们回答了“什么平台”。由于存在许多不同版本的Windows,因此它们都不能全面描述如何获得isWindows的答案。

类似于https://dev59.com/YnVC5IYBdhLWcg3wvT7g的问题,与Python相关。 - monkut
4
"应该有一种明显的方式来完成它,最好只有一种方式。" 然而,Python 给了我们至少三种方式。 - John Fouhy
2
注意:根据PEP8规范,应该优先使用名称is_windows而不是isWindows - phoenix
5个回答

504

Python os 模块

针对 Python 3.6/3.7:

os.name: 已导入的依赖于操作系统的模块名称。当前已注册以下名称:'posix','nt','java'。

在您的情况下,您需要检查 'nt' 是否为 os.name 的输出:

import os

if os.name == 'nt':
     ...

关于 os.name 的说明:

另外还要注意,sys.platform 更具细分粒度,并且os.uname() 提供了与系统相关的版本信息。

platform 模块提供了系统身份的详细检查。


84
"nt" 是 Windows 操作系统的一个数值。 - shuckc
3
Linux通常返回什么?posix? - Andi Jay
34
不一定。你可能没有运行Linux的计算机可用。 - ArtOfWarfare
6
@ArtOfWarfare 你不需要一台机器 ;) (也许在2015年需要) https://onlinegdb.com/HyhJEzdX4 - jay
3
'java'操作系统是什么?Linux和Windows有意义,但Java不是一个操作系统,对吗? - Haltarys
显示剩余4条评论

84

你是否正在使用 platform.system

system()
        返回系统/操作系统名称,例如'Linux'、'Windows'或'Java'。
如果无法确定该值,则返回空字符串。

如果这不起作用,可以尝试使用 platform.win32_ver,如果它没有引发异常,则表示您正在使用 Windows;但我不知道这是否与64位兼容,因为名称中包含32。

win32_ver(release='', version='', csd='', ptype='')
        从Windows注册表中获取附加版本信息,并返回一个元组(version,csd,ptype),该元组指的是版本号、CSD级别和操作系统类型(多处理器/单处理器)。

但是,像其他人提到的那样,os.name 可能是最好的选择。


值得一提的是,以下是 platform.py 文件中检查 Windows 的几种方式:

if sys.platform == 'win32':
#---------
if os.environ.get('OS','') == 'Windows_NT':
#---------
try: import win32api
#---------
# Emulation using _winreg (added in Python 2.0) and
# sys.getwindowsversion() (added in Python 2.3)
import _winreg
GetVersionEx = sys.getwindowsversion
#----------
def system():

    """ Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'.    
        An empty string is returned if the value cannot be determined.   
    """
    return uname()[0]

2
在一台64位机器上,使用Windows 7(64位操作系统),输出如下:Python 3.1.1 (r311:74483, Aug 17 2009, 16:45:59) [MSC v.1500 64 bit (AMD64)] on win32 >>> print(sys.platform) win32 >>> platform.win32_ver() ('post2008Server', '6.1.7100', '', 'Multiprocessor Free')请注意,构建明确将其称为win32。 - Francesco
哎呀,我以为输出会格式化得更好一些。希望你还是能够读懂它。 - Francesco
这应该是被接受的答案。 - Marco Sulla

52

你应该可以依靠 os.name。

import os
if os.name == 'nt':
    # ...

编辑:现在我会说,最清晰的方法是通过平台(platform)模块来完成,与其他答案相同。


43

同时也在 sys 模块中:

import sys
# its win32, maybe there is win64 too?
is_windows = sys.platform.startswith('win')

6
我使用的是 64 位 Windows,但它显示为“win32” :) - Hut8
@Hut8 我刚刚也注意到了同样的事情。 - voices
我有点确定它通常会返回“win32”,至少我只在我读过的代码中看到了对此的检查。 - user4396006

22
import platform
is_windows = any(platform.win32_ver())
或者
import sys
is_windows = hasattr(sys, 'getwindowsversion')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接