2013-10-02 15 views
6

Mamy skrypt, który używa platform module do wykrywania wersji OS naszych różnych klientów.Wykryj Windows 8.1 w Pythonie?

Przeglądając źródło dla platform.py, widzę, że w systemach Windows używa on sys.getwindowsverion(). Niestety, Windows 8.1 Systemy, że poszczególne raporty funkcyjne:

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

systemie Windows 8.1 jest 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] 

Tak, zdaję sobie sprawę, mogę napisać trochę więcej logiki wokół mojego zaproszenia do platform.release(), a jeśli to zwróci 8, wykonaj dodatkowe sprawdzenie i spróbuj uruchomić ver, ale wydaje się to nieco zawiłe.

Czy ktoś wie o lepszy sposób?

Uruchamianie ActivePython 2.7.2.5 na wszelki wypadek. . .

+0

Windows może cię okłamać, jeśli zdecyduje, że powinieneś działać w trybie win8. Może się tak zdarzyć w przypadku aplikacji win8 w wersji nowoczesnej, które nie zostały zaktualizowane do wersji 8.1, ale wątpię, aby współczesny Python został uruchomiony. – ohmusama

+0

Och, krówki. Python używa do tego funkcji [MS 'GetVersionEx()' (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724451 (v = vs.85) .aspx). Podążaj za linkiem: wygląda na to, że zastępują go bezużytecznym nowym funkcjonowaniem :-( –

+3

FYI, [otworzyłem zgłoszenie błędu na ten temat] (http://bugs.python.org/issue19143) na temat śledzenia błędów Pythona W międzyczasie rób wszystko, co działa ;-) –

Odpowiedz

3

Firma Microsoft zmieniła sposób zachowania funkcji wersji. Aby uzyskać więcej informacji, zobacz this page.

Sposób, w jaki pracowałem nad problemem polega na użyciu ctypów i funkcji trybu jądra, RtlGetVersion. Pomimo tego, że jest to funkcja trybu jądra, można ją wywołać z trybu użytkownika. Próbowałem tego w wielu wersjach systemu Windows i nie miałem problemu.

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

Można prosty dostać go z rejestru HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion tam masz Nazwa Wartość CurrentVersion a dane w Windows 8.1 będzie 6.3 To zadziała platformę żadnych okien

Powiązane problemy