python - 在 Python 中检测 Windows 8.1?

标签 python windows

我们有一个使用 platform module 的脚本检测我们各种客户端的操作系统版本。

查看 platform.py 的源代码,我可以看到在 Windows 系统上,它使用的是 sys.getwindowsverion()。不幸的是,在 Windows 8.1 系统上,该特定函数报告:

>>> sys.getwindowsversion()
sys.getwindowsversion(major=6, minor=2, build=9200, platform=2, service_pack='')

Windows 8.1 是 6.3.9600:

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Windows\system32>ver

Microsoft Windows [Version 6.3.9600]

因此,我意识到我可以围绕对 platform.release() 的调用编写一些额外的逻辑,如果它返回 8,则进行二次检查并尝试运行 ver,但这似乎有点令人费解。

有人知道更好的方法吗?

运行 ActivePython 2.7.2.5 以防万一。 . .

最佳答案

Microsoft 更改了版本函数的行为方式。参见 this page了解更多信息。

我解决这个问题的方法是使用 ctypes 和内核模式函数,RtlGetVersion .尽管这是一个内核模式函数,但可以从用户模式调用它。我已在许多版本的 Windows 上尝试过此操作,但没有遇到问题。

import ctypes

class OSVERSIONINFOEXW(ctypes.Structure):
    _fields_ = [('dwOSVersionInfoSize', ctypes.c_ulong),
                ('dwMajorVersion', ctypes.c_ulong),
                ('dwMinorVersion', ctypes.c_ulong),
                ('dwBuildNumber', ctypes.c_ulong),
                ('dwPlatformId', ctypes.c_ulong),
                ('szCSDVersion', ctypes.c_wchar*128),
                ('wServicePackMajor', ctypes.c_ushort),
                ('wServicePackMinor', ctypes.c_ushort),
                ('wSuiteMask', ctypes.c_ushort),
                ('wProductType', ctypes.c_byte),
                ('wReserved', ctypes.c_byte)]

def get_os_version():
    """
    Get's the OS major and minor versions.  Returns a tuple of
    (OS_MAJOR, OS_MINOR).
    """
    os_version = OSVERSIONINFOEXW()
    os_version.dwOSVersionInfoSize = ctypes.sizeof(os_version)
    retcode = ctypes.windll.Ntdll.RtlGetVersion(ctypes.byref(os_version))
    if retcode != 0:
        raise Exception("Failed to get OS version")

    return os_version.dwMajorVersion, os_version.dwMinorVersion

关于python - 在 Python 中检测 Windows 8.1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19128219/

相关文章:

python - Kivy 性能随时间下降

python - 像这样的字符串的正则表达式

python - 通过字符串查找解析全局命名空间中的 Python 对象

python - 读取文件python时出错

python - Heroku Python Web 进程未能在 60 秒内绑定(bind)到 $PORT - 不是很明显

c - WINAPI 代表什么

java - 如何查找在tomcat服务器中打开的文件数

windows - 使用 xcopy 批量覆盖只读文件

c++ - 减慢 Windows 进程?

windows - 使用变量后 PowerShell 命令失败