2015-06-19 14 views
5

Ho difficoltà a leggere una chiave di registro creata dal mio software. Tuttavia con lo stesso codice, sono in grado di leggere altre chiavi.winreg.OpenKey genera un errore di filerotazione per le chiavi di registro esistenti

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 mostra

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 query Tuttavia Windows è in grado di recuperare il valore impostato.

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

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

Qualsiasi aiuto sarà molto apprezzato

+0

modificato l'errore nell'istruzione query req. Ma questo non dovrebbe comunque essere un problema. – Debianeese

risposta

6

Ci sono 2 di vista del Registro di sistema. C'è la vista del registro a 32 bit e la vista del registro a 64 bit. Per impostazione predefinita e nella maggior parte dei casi, le applicazioni a 32 bit vedranno solo la vista del registro a 32 bit e le applicazioni a 64 bit vedranno solo la vista del registro a 64 bit.

È possibile accedere all'altra vista utilizzando i flag di accesso KEY_WOW64_64KEY o KEY_WOW64_32KEY.

Se si esegue a 32 bit pitone e la chiave è parte della vista registro a 64 bit, è necessario utilizzare qualcosa di simile per aprire la chiave:

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

Se si esegue a 64-bit pitone e la chiave è parte della vista registro a 32 bit, si dovrebbe usare qualcosa di simile per aprire la chiave:

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

Se si conosce la chiave è sempre parte della stessa visione, aggiungendo il corretto accesso KEY_WOW64_* flag garantisce che funzioni indipendentemente dal tuo python architectur e è.

Nel caso più generico, se si dispone di un'architettura python variabile e non si sa in anticipo in quale vista sarà la chiave, è possibile provare a trovare la chiave nella vista corrente e provare l'altra vista successiva. Potrebbe essere simile a questa:

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

Per ulteriori informazioni, visitate Accessing an Alternate Registry View.

+0

Questo ha funzionato interamente per me. – SirJames

Problemi correlati