2013-02-28 214 views
10

我开发了一个python脚本,其中我有一个设置窗口,其中有选择安装软件的路径的选项。当单击设置窗口的确定按钮时,我想要将所有选定的路径写入注册表,并在设置窗口再次打开时读取相同的内容。 我的代码如下所示。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其工作尝试,但不满意我编程的方式。帮助我解决更好的解决方案

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 2013-02-28 06:23:04

+0

IS HKEY_CURRENT_USER是否适用于管理员和其他用户帐户? – Aramanethota 2013-02-28 06:26:33

+0

如果访客用户可以访问注册表中的密钥,那么Admin也是如此。 – 2013-02-28 06:30:20

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的Python脚本完成了所要求的内容等等。

下面是一些例子,假设它已被保存在当前路径中某处的文件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()