2013-10-02 67 views
6

我們有一個腳本,它使用platform module來檢測我們各種客戶端的操作系統版本。在Python中檢測Windows 8.1?

通過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以防萬一。 。 。

+0

如果Windows確定您應該以win8模式運行,Windows可以騙你。對於尚未更新到8.1的現代win8應用來說,情況可能是這樣,但我懷疑你是在現代運行python。 – ohmusama

+0

哦,軟糖。 Python爲此使用[MS'GetVersionEx()'函數](http://msdn.microsoft.com/en-us/library/windows/desktop/ms724451(v = vs.85).aspx)。關注鏈接:看起來他們正在用一堆不可用的新函數取代它:-( –

+3

僅供參考,我[在Python bug跟蹤器上打開了一個關於此問題的bug報告](http://bugs.python.org/issue19143) 。在此期間,做任何有效的工作;-) –

回答

3

微軟改變了版本功能的行爲方式。有關更多信息,請參閱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 
1

你可以簡單的從註冊表 HKEY_LOCAL_MACHINE \ SOFTWARE \得到它的Microsoft \ Windows NT的\ CURRENTVERSION 你有值的名稱CURRENTVERSION 和Windows 8.1中的數據將6.3 它將工作在任何Windows平臺