2015-06-19 11 views
5

मुझे अपने सॉफ़्टवेयर द्वारा बनाई गई रजिस्ट्री कुंजी पढ़ने में कठिनाइयों का सामना करना पड़ रहा है। हालांकि एक ही कोड के साथ, मैं अन्य चाबियाँ पढ़ने में सक्षम हूं।winreg.OpenKey मौजूदा रजिस्ट्री कुंजियों के लिए filenotfound त्रुटि फेंकता है

installdir = winreg.OpenKey(
          winreg.HKEY_LOCAL_MACHINE, 
          "SOFTWARE\\Microsoft\\MediaPlayer\\Player\\Extensions\\Types" 
          ) #this works perfect 
#installdir1 = winreg.OpenKey(
           winreg.HKEY_LOCAL_MACHINE, 
          "SOFTWARE\\MySoftware\\MyEvent\\IS" 
          ) #this gives Filenotfound error 

# list values owned by this registry key 
try: 
    i = 0 
    while 1: 
     name, value, type = winreg.EnumValue(installdir, i) 
     print (repr(name)) 
     i += 1 
except WindowsError: 
    print ("Bot donf") 
value, type = winreg.QueryValueEx(installdir, "10") 
print("user is", repr(value)) 

value, type = winreg.QueryValueEx(winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS"), "v2") 
print("user is", repr(value)) 

Traceback से पता चलता

Traceback (most recent call last): 
    File "D:/python_scripts/myclass.py", line 32, in <module> 
    value, type = winreg.QueryValueEx(winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS"), "v2") 
    FileNotFoundError: [WinError 2] The system cannot find the file specified 

हालांकि विंडोज reg क्वेरी मूल्य सेट को पुनः प्राप्त करने में सक्षम है।

#reg query HKLM\SOFTWARE\MySoftware\MyEvent\IS /v v2 

HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware\MyEvent\IS 
v2 REG_DWORD 0x12 

किसी भी मदद अत्यधिक

+0

रीक क्वेरी कथन में टाइपो संपादित किया गया। लेकिन किसी भी तरह की समस्या नहीं होनी चाहिए – Debianeese

उत्तर

6

सराहना की जाएगी रजिस्ट्री के 2 बार देखा गया हैं। 32-बिट रजिस्ट्री व्यू और 64-बिट रजिस्ट्री व्यू है। डिफ़ॉल्ट रूप से और अधिकांश मामलों में, 32-बिट अनुप्रयोग केवल 32-बिट रजिस्ट्री व्यू देखेंगे और 64-बिट एप्लिकेशन केवल 64-बिट रजिस्ट्री व्यू देखेंगे।

अन्य दृश्य KEY_WOW64_64KEY या KEY_WOW64_32KEY एक्सेस फ़्लैग का उपयोग कर एक्सेस किया जा सकता है।

आप 32-बिट अजगर चल रहे हैं और अपने प्रमुख 64-बिट रजिस्ट्री दृश्य का हिस्सा है, तो आप कुछ इस तरह अपने प्रमुख को खोलने के लिए उपयोग करना चाहिए:

winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | winreg.KEY_WOW64_64KEY) 

आप 64-बिट चला रहे हैं अजगर और अपने प्रमुख 32-बिट रजिस्ट्री दृश्य का हिस्सा है, तो आप अपने कुंजी खोलने के लिए कुछ इस तरह उपयोग करना चाहिए:

winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | winreg.KEY_WOW64_32KEY) 

क्या आप जानते हैं कुंजी हमेशा एक ही दृश्य का हिस्सा है, तो उचित KEY_WOW64_* पहुँच जोड़ने ध्वज यह सुनिश्चित करेगा कि इससे कोई फर्क नहीं पड़ता कि आपके अजगर वास्तुकार क्या हैं ई है।

सबसे सामान्य मामले में, यदि आपके पास चरम पायथन आर्किटेक्चर है और आप पहले से नहीं जानते हैं कि कुंजी क्या होगी, तो आप अपने वर्तमान दृश्य में कुंजी ढूंढने का प्रयास कर सकते हैं और अगले दृश्य को आजमा सकते हैं। यह कुछ ऐसा दिख सकता है:

try: 
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS") 
except FileNotFoundError: 
    import platform 

    bitness = platform.architecture()[0] 
    if bitness == '32bit': 
     other_view_flag = winreg.KEY_WOW64_64KEY 
    elif bitness == '64bit': 
     other_view_flag = winreg.KEY_WOW64_32KEY 

    try: 
     key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | other_view_flag) 
    except FileNotFoundError: 
     ''' 
     We really could not find the key in both views. 
     ''' 

अधिक जानकारी के लिए, Accessing an Alternate Registry View देखें।

+0

यह पूरी तरह से मेरे लिए काम किया। – SirJames

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