2013-10-02 13 views
6

Chúng tôi có một tập lệnh sử dụng platform module để phát hiện phiên bản hệ điều hành của các máy khách khác nhau của chúng tôi.Phát hiện Windows 8.1 bằng Python?

Xem qua nguồn cho platform.py, tôi có thể thấy rằng trên các hệ thống Windows, nó đang sử dụng sys.getwindowsverion(). Thật không may, trên Windows 8.1 hệ thống, mà chức năng báo cáo cụ thể:

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

Windows 8.1 là 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] 

Vì vậy, tôi nhận ra tôi có thể viết thêm một số logic xung quanh cuộc gọi của tôi để platform.release(), và nếu điều đó trả về 8, hãy kiểm tra thứ cấp và cố gắng chạy ver, nhưng điều đó có vẻ hơi phức tạp.

Có ai biết cách nào tốt hơn không?

Chạy ActivePython 2.7.2.5 trong trường hợp quan trọng. . .

+0

Windows có thể nói dối bạn, nếu nó quyết định bạn nên chạy trong chế độ win8. Điều này có thể là trường hợp cho các ứng dụng win8 trong hiện đại mà chưa được cập nhật lên 8.1, nhưng tôi nghi ngờ bạn đang chạy python trong hiện đại. – ohmusama

+0

Ồ, xúc phạm. Python sử dụng hàm [MS 'GetVersionEx()' (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724451 (v = vs.85) .aspx) cho việc này. Thực hiện theo các liên kết: có vẻ họ đang thay thế nó với một mess không thể sử dụng các chức năng mới :-( –

+3

FYI, tôi [đã mở một báo cáo lỗi về điều này] (http://bugs.python.org/issue19143) trên trình theo dõi lỗi Python Trong khi chờ đợi, hãy làm bất cứ điều gì hoạt động ;-) –

Trả lời

3

Microsoft đã thay đổi cách hoạt động của hàm phiên bản. Xem this page để biết thêm thông tin.

Cách tôi làm việc xung quanh vấn đề là sử dụng ctypes và chức năng chế độ hạt nhân, RtlGetVersion. Mặc dù đây là một chức năng chế độ hạt nhân nó có thể được gọi từ chế độ người dùng tốt. Tôi đã thử điều này trên nhiều phiên bản của Windows và không có vấn đề gì.

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

Bạn có thể đơn giản lấy nó từ registry HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion đó bạn có tên giá trị CurrentVersion Và liệu trong Windows 8.1 sẽ là 6,3 Nó sẽ làm việc một nền tảng bất kỳ cửa sổ

Các vấn đề liên quan