在Python中检测Windows 8.1?

2024-10-01 11:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

查资料平台.py,我可以看到在Windows系统上,它使用系统getwindowsverion(). 不幸的是,在Windows 8.1系统上,该功能报告:

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

Windows 8.1为6.3.9600:

^{pr2}$

所以,我意识到我可以写一些额外的逻辑平台.释放(),如果返回8,则执行第二次检查并尝试运行ver,但这似乎有点复杂。在

有人知道更好的方法吗?在

运行ActivePython2.7.2.5以防重要。在


Tags: py功能版本脚本客户机windows系统报告
2条回答

你可以简单地从注册表中得到它 HKEY U本地机器\软件\Microsoft\Windows NT\CurrentVersion 这里有值名CurrentVersion 而windows8.1中的数据将是6.3 它可以在任何windows平台上运行

微软改变了version函数的行为方式。有关更多信息,请参见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

相关问题 更多 >