2013-10-02 9 views
6

हमारे पास एक ऐसी स्क्रिप्ट है जो हमारे विभिन्न ग्राहकों के ओएस संस्करण का पता लगाने के लिए platform module का उपयोग करती है।पायथन में विंडोज 8.1 का पता लगाएं?

platform.py के लिए स्रोत के माध्यम से देखकर, मैं देख सकता हूं कि विंडोज सिस्टम पर, यह sys.getwindowsverion() का उपयोग कर रहा है। दुर्भाग्य से, विंडोज पर 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

विंडोज़ आपसे झूठ बोल सकता है, अगर यह निर्णय लेता है कि आपको Win8 मोड में चलाना चाहिए। यह आधुनिक में Win8 ऐप्स के मामले में हो सकता है जिसे 8.1 तक अपडेट नहीं किया गया है, लेकिन मुझे संदेह है कि आप आधुनिक में अजगर चल रहे हैं। – ohmusama

+0

ओह, फज। पाइथन इस के लिए [एमएस 'GetVersionEx()' फ़ंक्शन] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724451 (v = vs.85) .aspx) का उपयोग करता है। लिंक का पालन करें: ऐसा लगता है कि वे इसे नए कार्यों के एक अनुपयोगी गड़बड़ के साथ बदल रहे हैं :-( –

+3

FYI, मैंने [इसके बारे में एक बग रिपोर्ट खोली है] (http://bugs.python.org/issue19143) पायथन बग ट्रैकर पर इस बीच, काम करने वाली कुछ भी करें ;-) –

उत्तर

3

माइक्रोसॉफ्ट ने वर्जन फ़ंक्शन का व्यवहार करने के तरीके को बदल दिया। कुछ और जानकारी के लिए this page देखें।

जिस तरह से मैंने समस्या के आसपास काम किया है, वह ctypes और कर्नेल मोड फ़ंक्शन का उपयोग करना है, RtlGetVersion। यह कर्नेल मोड फ़ंक्शन होने के बावजूद इसे उपयोगकर्ता मोड से ठीक कहा जा सकता है। मैंने विंडोज़ के कई संस्करणों पर यह कोशिश की है और कोई समस्या नहीं है।

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 यह एक किसी भी खिड़कियों मंच काम करेंगे होगा

संबंधित मुद्दे