2015-06-19 14 views
5

Ich habe Schwierigkeiten beim Lesen eines Registrierungsschlüssels von meiner Software erstellt. Mit dem gleichen Code kann ich jedoch andere Schlüssel lesen.Winreg.OpenKey löst Filenotfound Fehler für vorhandene Registrierungsschlüssel

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 zeigt

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 

jedoch Windows-reg Abfrage der Lage ist, den eingestellten Wert abzurufen.

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

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

Jede Hilfe wird sehr

+0

bearbeitet den Tippfehler in req Abfrageanweisung. Aber das sollte sowieso kein Problem sein – Debianeese

Antwort

6

der Registrierung Es gibt zwei Ansichten geschätzt. Es gibt die 32-Bit-Registrierungsansicht und die 64-Bit-Registrierungsansicht. In den meisten Fällen sehen 32-Bit-Anwendungen nur die 32-Bit-Registrierungsansicht und 64-Bit-Anwendungen nur die 64-Bit-Registrierungsansicht.

Auf die andere Ansicht kann mit den Zugriffsflags KEY_WOW64_64KEY oder KEY_WOW64_32KEY zugegriffen werden.

Wenn Sie mit 32-Bit-Python und Ihr Schlüssel ist Teil der 64-Bit-Register Ansicht, sollten Sie so etwas wie diese, um Ihren Schlüssel zu öffnen:

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

Wenn Sie 64-Bit laufen python und Ihr Schlüssel ist Teil der Ansicht-32-Bit-Register, sollten Sie so etwas wie diese, um Ihren Schlüssel zu öffnen:

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

Wenn Sie den Schlüssel ist immer Teil der gleichen Ansicht wissen, das Hinzufügen des richtigen KEY_WOW64_* Zugangs Flag wird sicherstellen, dass es unabhängig von Ihrer Python-Architektur funktioniert e ist. Im allgemeinsten Fall, wenn Sie eine variable Python-Architektur haben und Sie nicht im Voraus wissen, in welcher Ansicht der Schlüssel sein wird, können Sie versuchen, den Schlüssel in Ihrer aktuellen Ansicht zu finden und die andere Ansicht als nächstes auszuprobieren. Es könnte wie folgt aussehen:

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. 
     ''' 

Weitere Informationen besuchen Sie Accessing an Alternate Registry View.

+0

Das hat ganz für mich funktioniert. – SirJames