2013-02-28 4 views
10

Я разработал скрипт python, где у меня есть окно настроек, в котором есть опции для выбора путей для установки программного обеспечения. При нажатии кнопки OK окна настроек i хотите записать все выбранные пути в реестр и прочитать их, когда окно установки снова открывается. Мой код выглядит, как показано ниже.скрипт python для чтения и записи пути к реестру

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) 

Я получаю сообщение об ошибке, как показано ниже:

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 

И читать из реестра, сохраненный реестр должен отображаться в заходящего window.I попытался с ниже code.Though его работы, но не удовлетворены тем, как я запрограммирован it.Help меня за лучшее решение

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) 

ответ

4

Python скрипт для чтения из реестра выглядит следующим образом:

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 скрипт для записи в реестр:

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 

Надеется, что это помогает вам all.Cheers :)

1

Похоже, у вас нет прав на редактирование реестра. Если вы являетесь администратором, запустите этот скрипт в режиме повышенной.

+0

Да, я пользовался гостевым пользователем, поэтому я не понял его. Я изменил HKEY_LOCAL_MACHINE на HKEY_CURRENT_USER, и теперь он работает нормально. – Aramanethota

+0

IS HKEY_CURRENT_USER работает как для администратора, так и для другой учетной записи пользователя ?? – Aramanethota

+0

Если пользователь гостя может получить доступ к ключу в реестре, то так же может быть и администратор. –

8

То же, что и @Aramanethota, но с pep8 и func def для удобства использования.

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

Питон-скрипт из https://stackoverflow.com/a/28365272/548792 делает то, что было предложено, и многое другое.

Вот несколько примеров, если они были сохранены в файле с именем setenv.py где-то в текущем пути. Обратите внимание, что в данном примере не имеют нет админа прав на вашем компьютере, так что изменения происходят только для локального пользователя:

> 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

Вот класс, я написал (питон 2), который имеет возможность для восстановления состояния при завершении работы с реестром. Класс не был протестирован должным образом, поэтому он может содержать некоторые ошибки:

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()