2013-10-02 20 views
6

Çeşitli istemcilerin işletim sistemi sürümlerini algılamak için platform module'u kullanan bir komut dosyası var.Python'da Windows 8.1'i Algıla?

Platform.py kaynağına bakarak, Windows sistemlerinde sys.getwindowsverion() işlevini kullandığını görebiliyorum. Ne yazık ki, 8.1 sistemler, bu özel işlev raporları Windows: Windows'un

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

8,1 6.3.9600 geçerli: Yani

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

C:\Windows\system32>ver 

Microsoft Windows [Version 6.3.9600] 

, ben platform.release benim çağrısı etrafında bazı ekstra mantığı yazabilirsiniz fark() ve eğer 8 döndürürse, ikincil bir kontrol yapın ve ver'u çalıştırmayı deneyin, ancak bu biraz kıvrık gibi görünüyor.

Daha iyi bir yolu bilen var mı?

Önemli olan durumlarda ActivePython 2.7.2.5'i çalıştırmak. . .

+0

Win8 modunda çalışmakta olduğuna karar verirse, Windows size yalan söyleyebilir. Bu, 8.1'de güncellenen henüz modern olmayan win8 uygulamaları için geçerli olabilir, ancak python'u modern olarak kullandığınızdan şüpheliyim. – ohmusama

+0

Ah, şekerleme. Python, bunun için [MS 'GetVersionEx()' işlevini] kullanır (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724451 (v = vs.85) .aspx). Bağlantıyı takip et: yeni işlevlerin kullanılamaz bir karmaşasıyla değiştiriyorlar :-( –

+3

FYI, I [bu konuda bir hata raporu açtım] (http://bugs.python.org/issue19143) Python hata izleyicide Bu arada, çalışan bir şey yapın ;-) –

cevap

3

Microsoft, sürüm işlevinin davranış şeklini değiştirdi. Daha fazla bilgi için bkz. this page.

Sorunumda çalıştığım yol, klişeler ve çekirdek modu işlevini kullanmaktır, RtlGetVersion. Bunun bir çekirdek modu işlevi olmasına rağmen, kullanıcı modundan sadece iyi bir şekilde çağrılabilir. Bunu bir çok Windows sürümünde denedim ve bir sorunum olmadı.

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

yapabilirsiniz basit \ kayıt HKEY_LOCAL_MACHINE \ SOFTWARE adresinden elde Microsoft \ Windows NT \ CurrentVersion orada 6.3 Bir herhangi bir pencere platformu çalışacak olacaktır değer adı CurrentVersion'ı Ve Windows 8.1'de Verileri var

İlgili konular