如果用 Python 的话,一般来说是用不到注册表的,配置参数可以放在配置文件中。但在 Windows 下使用,还是避免不了注册表的。访问注册表可以使用 winreg 模块,不过该模块仅提供基础的 API ,使用起来不是很方便,本文对其进行简单的封装,以使其稍微好用一点。
程序代码
# 项目:标准库函数
# 模块:Windows注册表读写模块
# 作者:黄涛
# License:GPL
# Email:huangtao.sh@icloud.com
# 创建:2017-03-15 20:35
# 警告:
# 编写跨平台程序时,不要直接引用本模块,正确的写法如下:
# if os.name=='nt':
# import regkey
#
from winreg import *
__all__='RegKey','HKLM','HKCU','HKU','REG_BINARY',\
'REG_DWORD','REG_EXPAND_SZ','REG_SZ'
class RegKey(object):
__slots__='_items','_key','_subkey'
def __init__(self,key,subkey=None):
self._items={}
self._key=key
self._subkey=subkey
def open(self):
if self._subkey:
subkey=self._subkey.replace('/','\\')
self._key=CreateKey(self._key,subkey)
self._subkey=None
return self
__enter__=open
def __truediv__(self,subkey):
if self._subkey:
# 未打开的返回自身
self._subkey='%s\\%s'%(self._subkey,subkey)
return self
else:
# 已调用open的返回一个新实例
return RegKey(self._key,subkey)
def close(self):
if hasattr(self._key,'Close'):
self._key.Close()
def __exit__(self,*args):
self.close()
def __getitem__(self,name):
if name not in self._items:
try:
val=QueryValueEx(self._key,name)
except:
val=None,None
self._items[name]=val
return self._items.get(name)
@property
def value(self):
return QueryValue(self._key,None)
@value.setter
def value(self,val):
return SetValue(self._key,REG_SZ,val)
def __setitem__(self,name,value):
if isinstance(value,(tuple,list))and len(value)==2:
if SetValueEx(self._key,name,0,*reversed(value)):
self._items[name]=value
else:
raise Exception('参数格式不正确,应为value,Type')
def __delitem__(self,name):
DeleteValue(self._key,name)
def iter_keys(self,func=EnumKey):
i=0
try:
while 1:
yield func(self._key,i)
i+=1
except:
pass
def iter_values(self):
return self.iter_keys(func=EnumValue)
HKLM=RegKey(HKEY_LOCAL_MACHINE)
HKCU=RegKey(HKEY_CURRENT_USER)
HKU=RegKey(HKEY_USERS)
使用示例
from regkey import *
with HKCU/'GNU/Emacs' as key:
print(key['HOME'])
key['HOME']='C:\\Users\\abc',REG_SZ
程序说明
前面的程序代码声明了一个 RegKey
的类,该类在初始化的时候,需要指定一个 key 的参数以及一个 subkey 的字符串。
RegKey
对象生成后,必须调用 open
以后才可以对它进行读写。读写完成后还应调用 close
进行关闭。
RegKey
对象提供一个 value
的属性,用于读写该项对应的值。可以用 item
的方式来读写该键下的值项,读取时返回一个以值、类型元组。设置时候也是以元组或列表对其进行设置,格式也是值 、类型。其中类型可以是 REG_SZ、REG_EXPAND_SZ、REG_DWORD等合法的类型。
该类提供了上下文的访问方法,可以在 with
中使用,以简化编程,使用方法见示例。
该模块提供了几个 HKCU、HKLM 等常量供初始化。