2013-02-28 14 views
10

Opracowałem skrypt Pythona, w którym mam okno ustawień, które ma opcje wyboru ścieżek do instalacji oprogramowania. Po kliknięciu przycisku OK okna ustawień, chcesz zapisać wszystkie wybrane ścieżki do rejestru i przeczytać to samo po ponownym otwarciu okna ustawień. Mój kod wygląda jak poniżej.skrypt Pythona do odczytu i zapisu ścieżki do rejestru

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) 

pojawia się błąd jak poniżej:

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 

I odczytu z rejestru, zapisany w rejestrze musi pokazać się w zachodzącym window.I próbował z poniższej code.Though jego pracy, ale nie zadowolony ze sposobu i zaprogramowany it.Help mi się lepszym rozwiązaniem

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) 

Odpowiedz

4

Python skrypt do odczytu z rejestru jest następujący:

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 [""] 

Python skrypt napisać do rejestru jest:

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 

Nadzieja to pomaga all.Cheers :)

1

wygląda nie masz uprawnień do edytowania rejestru. Incase, jeśli jesteś administratorem, uruchom ten skrypt w stanie Wyniesiony.

+0

Tak, używałem gościa, więc nie zrozumiałem. Zmieniłem HKEY_LOCAL_MACHINE na HKEY_CURRENT_USER i teraz to działa dobrze. – Aramanethota

+0

IS HKEY_CURRENT_USER działa zarówno dla konta administratora, jak i innego użytkownika? – Aramanethota

+0

Jeśli użytkownik-gość może uzyskać dostęp do klucza w Rejestrze, to może również Admin. –

8

Taki sam jak @Aramanethota, ale z pep8 i func def dla łatwego użycia.

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

Pythona skrypt z https://stackoverflow.com/a/28365272/548792 ma co został poproszony, i więcej.

Oto kilka przykładów, zakładając, że zostały zapisane w pliku o nazwie setenv.py gdzieś w bieżącej ścieżce. Należy zauważyć, że w tych przykładach masz nie admin-prawa na komputerze, więc zmiany zachodzą tylko dla lokalnego użytkownika:

> 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

Oto klasa I napisał (python 2), który ma zdolność przywrócić stan po zakończeniu manipulowania rejestrem. Klasa nie została przetestowana poprawnie, więc może zawierać pewne błędy:

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() 
Powiązane problemy