2013-02-28 19 views
10

Ho sviluppato uno script python in cui ho una finestra di impostazione che ha le opzioni per selezionare i percorsi per l'installazione del software. Quando si fa clic sul pulsante OK della finestra di impostazione, io vuoi scrivere tutti i percorsi selezionati nel registro e leggere lo stesso quando si apre nuovamente la finestra di impostazione. Il mio codice appare come di seguito.script python per leggere e scrivere un percorso nel registro

def OnOk(self, event): 
    data1=self.field1.GetValue() #path selected in setting window 
    aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE) 
    keyVal=OpenKey(aReg,r"SOFTWARE\my path to\Registry", 0,KEY_WRITE) 
    try: 
     SetValueEx(keyVal,"Log file",0,REG_SZ,data1) 
    except EnvironmentError: 
     pass 
    CloseKey(keyVal) 
    CloseKey(aReg) 

ottengo un errore come di seguito:

Traceback (most recent call last): 
File "D:\PROJECT\project.py", line 305, in OnOk 
keyVal=OpenKey(aReg,r"SOFTWARE\my path to\Registry", 0,KEY_WRITE) 
WindowsError: [Error 5] Access is denied 

E per leggere dal Registro di sistema, il Registro di sistema salvato deve presentarsi nella impostazione window.I provato con il sotto code.Though il suo funzionamento, ma non soddisfatto del modo in cui ho programmato it.Help darmi una mano per la soluzione migliore

key = OpenKey(HKEY_CURRENT_USER, r'Software\my path to\Registry', 0, KEY_READ) 
    for i in range(4): 
     try: 
      n,v,t = EnumValue(key,i) 
      if i==0: 
       self.field2.SetValue(v) 
      elif i==1: 
       self.field3.SetValue(v) 
      elif i==2: 
       self.field4.SetValue(v) 
      elif i==3: 
       self.field1.SetValue(v) 
     except EnvironmentError:            
      pass 
CloseKey(key) 

risposta

4

Python script per leggere dal Registro di sistema è la seguente:

try: 
    root_key=OpenKey(HKEY_CURRENT_USER, r'SOFTWARE\my path to\Registry', 0, KEY_READ) 
    [Pathname,regtype]=(QueryValueEx(root_key,"Pathname")) 
    CloseKey(root_key) 
    if (""==Pathname): 
     raise WindowsError 
except WindowsError: 
    return [""] 

script Python per scrivere nel Registro è:

try: 
    keyval=r"SOFTWARE\my path to\Registry" 
    if not os.path.exists("keyval"): 
     key = CreateKey(HKEY_CURRENT_USER,keyval) 
    Registrykey= OpenKey(HKEY_CURRENT_USER, r"SOFTWARE\my path to\Registry", 0,KEY_WRITE) 
    SetValueEx(Registrykey,"Pathname",0,REG_SZ,Pathname) 
    CloseKey(Registrykey) 
    return True 
except WindowsError: 
    return False 

Speranza che aiuta a all.Cheers :)

1

Sembra che tu non hai il permesso di modificare il Registro di sistema. In caso di amministratore, eseguire questo script in stato elevato.

+0

Sì, stavo usando l'utente ospite, quindi non ho capito bene. Ho cambiato HKEY_LOCAL_MACHINE in HKEY_CURRENT_USER e ora funziona correttamente. – Aramanethota

+0

IS HKEY_CURRENT_USER funziona sia per l'amministratore che per l'altro account utente ?? – Aramanethota

+0

Se l'utente Guest può accedere alla chiave nel registro, può farlo anche Amministratore. –

8

Come @Aramanethota ma con pep8 e func def per un facile utilizzo.

REG_PATH = r"SOFTWARE\my_program\Settings" 

def set_reg(name, value): 
    try: 
     _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, REG_PATH) 
     registry_key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, REG_PATH, 0, 
             _winreg.KEY_WRITE) 
     _winreg.SetValueEx(registry_key, name, 0, _winreg.REG_SZ, value) 
     _winreg.CloseKey(registry_key) 
     return True 
    except WindowsError: 
     return False 

def get_reg(name): 
    try: 
     registry_key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, REG_PATH, 0, 
             _winreg.KEY_READ) 
     value, regtype = _winreg.QueryValueEx(registry_key, name) 
     _winreg.CloseKey(registry_key) 
     return value 
    except WindowsError: 
     return None 
0

Il Python-script da https://stackoverflow.com/a/28365272/548792 fa ciò che è stato chiesto, e altro ancora.

Ecco alcuni esempi, ammesso che è stato salvato in afile chiamato setenv.py da qualche parte nel percorso corrente. noti che in questo esempio avete non admin-diritti sul PC, in modo da cambiamenti avvengono solo per utente locale:

> REM ## Query env-var: 
> setenv.py PATH C:\foo 
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied 
!!!Cannot find HKEY_CURRENT_USER\Environment:PATH due to: [WinError 2] The system cannot find the file specified 

> REM ## Set env-var: 
> setenv.py PATH C:\foo 
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied 
---Updated HKEY_CURRENT_USER\Environment:PATH=C:\foo 

> REM ## Append env-var: 
> setenv.py +PATH D:\Bar 
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied 
---Updated HKEY_CURRENT_USER\Environment:PATH=C:\foo;D:\Bar 

> REM ## Delete env-var: 
> setenv.py -PATH 
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied 
---Deleted HKEY_CURRENT_USER\Environment:PATH 
7
#Python3 version of hugo24's snippet 
import winreg 

REG_PATH = r"Control Panel\Mouse" 

def set_reg(name, value): 
    try: 
     winreg.CreateKey(winreg.HKEY_CURRENT_USER, REG_PATH) 
     registry_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, REG_PATH, 0, 
             winreg.KEY_WRITE) 
     winreg.SetValueEx(registry_key, name, 0, winreg.REG_SZ, value) 
     winreg.CloseKey(registry_key) 
     return True 
    except WindowsError: 
     return False 

def get_reg(name): 
    try: 
     registry_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, REG_PATH, 0, 
             winreg.KEY_READ) 
     value, regtype = winreg.QueryValueEx(registry_key, name) 
     winreg.CloseKey(registry_key) 
     return value 
    except WindowsError: 
     return None 

#Example MouseSensitivity 
#Read value 
print (get_reg('MouseSensitivity')) 

#Set Value 1/20 (will just write the value to reg, the changed mouse val requires a win re-log to apply*) 
set_reg('MouseSensitivity', str(10)) 

#*For instant apply of SystemParameters like the mouse speed on-write, you can use win32gui/SPI 
#http://docs.activestate.com/activepython/3.4/pywin32/win32gui__SystemParametersInfo_meth.html 
0

Ecco una classe che ho scritto (Python 2), che ha la capacità ripristinare lo stato al termine della modifica del registro. La classe non è stata testata correttamente quindi potrebbe contenere alcuni bug:

import _winreg as winreg 

class Registry(object): 
    def __init__(self, restore_state=False): 
     self.m_backup = {} 
     self.m_restore_state = restore_state 

    def get_key(self, hkey, subkey, access, create_if_doesnt_exist=True): 
     created_key = False 
     registry_key = None 
     try: 
      registry_key = winreg.OpenKey(hkey, subkey, 0, access) 
     except WindowsError: 
      try: 
       if create_if_doesnt_exist: 
        registry_key = winreg.CreateKey(hkey, subkey) 
        if registry_key not in self.m_backup: 
         self.m_backup[registry_key] = ({}, (hkey, subkey)) 
       else: 
        registry_key = None 
      except WindowsError: 
       if registry_key: 
        self.close_key(registry_key) 
       raise Exception('Registry does not exist and could not be created.') 
     return registry_key 

    def close_key(self, registry_key): 
     closed = False 
     if registry_key: 
      try: 
       winreg.CloseKey(registry_key) 
       closed = True 
      except: 
       closed = False 
     return closed   

    def get_reg_value(self, hkey, subkey, name): 
     value = None 
     registry_key = self.get_key(hkey, subkey, winreg.KEY_READ, False) 
     if registry_key: 
      try: 
       value, _ = winreg.QueryValueEx(registry_key, name) 
      except WindowsError: 
       value = None 
      finally: 
       self.close_key(registry_key) 
     return value 

    def set_reg_value(self, hkey, subkey, name, type, value): 
     registry_key = self.get_key(hkey, subkey, winreg.KEY_WRITE, True) 
     backed_up = False 
     was_set = False 
     if registry_key: 
      if self.m_restore_state: 
       if registry_key not in self.m_backup: 
        self.m_backup[registry_key] = ({}, None) 
       existing_value = self.get_reg_value(hkey, subkey, name) 
       if existing_value: 
        self.m_backup[registry_key][0][name] = (existing_value, type, False) 
       else: 
        self.m_backup[registry_key][0][name] = (None, None, True) 
       backed_up = True     
      try: 
       winreg.SetValueEx(registry_key, name, 0, type, value) 
       was_set = True 
      except WindowsError: 
       was_set = False 
      finally: 
       if not backed_up: 
        self.close_key(registry_key) 
     return was_set 

    def restore_state(self): 
     if self.m_restore_state: 
      for registry_key, data in self.m_backup.iteritems(): 
       backup_dict, key_info = data 
       try: 
        for name, backup_data in backup_dict.iteritems(): 
         value, type, was_created = backup_data 
         if was_created: 
          print registry_key, name 
          winreg.DeleteValue(registry_key, name) 
         else: 
          winreg.SetValueEx(registry_key, name, 0, type, value) 
        if key_info: 
         hkey, subkey = key_info 
         winreg.DeleteKey(hkey, subkey) 
       except: 
        raise Exception('Could not restore value') 
       self.close_key(registry_key) 

    def __del__(self): 
     if self.m_restore_state: 
      self.restore_state() 
Problemi correlati