2015-06-19 35 views
5

Mam trudności w czytaniu klucza rejestru utworzonego przez moje oprogramowanie. Jednak z tym samym kodem, jestem w stanie odczytać inne klucze.winreg.OpenKey zgłasza błąd Filenotfound dla istniejących kluczy rejestru

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 pokazuje

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 

zapytania reg Jednak Windows jest w stanie odzyskać ustawioną wartość.

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

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

Każda pomoc będzie bardzo mile widziane

+0

edytował literówkę w zapytaniu zapytania kwerendy. Ale to nie powinno stanowić problemu. – Debianeese

Odpowiedz

6

Istnieją 2 widoki rejestrze. Istnieje 32-bitowy widok rejestru i widok rejestru 64-bitowego. Domyślnie iw większości przypadków 32-bitowe aplikacje będą widzieć tylko 32-bitowy widok rejestru, a 64-bitowe aplikacje będą widzieć tylko 64-bitowy widok rejestru.

Do innego widoku można uzyskać dostęp za pomocą flag dostępu KEY_WOW64_64KEY lub KEY_WOW64_32KEY.

Jeśli używasz 32-bitowej Python i klucz jest częścią 64-bitowym widzenia rejestru, należy użyć coś takiego otworzyć klucza:

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

Jeśli używasz 64-bitowej python i klucz jest częścią 32-bitowym widzenia rejestru, należy użyć coś takiego otworzyć klucza:

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

Jeśli znasz klucz jest zawsze częścią tego samego względu, dodając odpowiednią KEY_WOW64_* dostęp flaga zapewni, że działa bez względu na to, jaki jest Twój architekt Pythona e jest.

W najbardziej ogólnym przypadku, jeśli masz zmienną architekturę Pythona i nie wiesz z góry, w którym widoku klucz będzie, możesz spróbować znaleźć klucz w bieżącym widoku i wypróbować inny widok w następnej kolejności. Może wyglądać mniej więcej tak:

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

Aby uzyskać więcej informacji, sprawdź Accessing an Alternate Registry View.

+0

To działało całkowicie dla mnie. – SirJames