如果用 Python 的話(huà),一般來(lái)說(shuō)是用不到注冊(cè)表的,配置參數(shù)可以放在配置文件中。但在 Windows 下使用,還是避免不了注冊(cè)表的。訪(fǎng)問(wèn)注冊(cè)表可以使用 winreg 模塊,不過(guò)該模塊僅提供基礎(chǔ)的 API ,使用起來(lái)不是很方便,本文對(duì)其進(jìn)行簡(jiǎn)單的封裝,以使其稍微好用一點(diǎn)。
程序代碼
# 項(xiàng)目:標(biāo)準(zhǔn)庫(kù)函數(shù)
# 模塊:Windows注冊(cè)表讀寫(xiě)模塊
# 作者:黃濤
# License:GPL
# Email:huangtao.sh@icloud.com
# 創(chuàng)建:2017-03-15 20:35
# 警告:
# 編寫(xiě)跨平臺(tái)程序時(shí),不要直接引用本模塊,正確的寫(xiě)法如下:
# 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:
# 未打開(kāi)的返回自身
self._subkey='%s\\%s'%(self._subkey,subkey)
return self
else:
# 已調(diào)用open的返回一個(gè)新實(shí)例
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('參數(shù)格式不正確,應(yīng)為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
程序說(shuō)明
前面的程序代碼聲明了一個(gè) RegKey 的類(lèi),該類(lèi)在初始化的時(shí)候,需要指定一個(gè) key 的參數(shù)以及一個(gè) subkey 的字符串。
RegKey 對(duì)象生成后,必須調(diào)用 open 以后才可以對(duì)它進(jìn)行讀寫(xiě)。讀寫(xiě)完成后還應(yīng)調(diào)用 close 進(jìn)行關(guān)閉。
RegKey 對(duì)象提供一個(gè) value 的屬性,用于讀寫(xiě)該項(xiàng)對(duì)應(yīng)的值??梢杂?item 的方式來(lái)讀寫(xiě)該鍵下的值項(xiàng),讀取時(shí)返回一個(gè)以值、類(lèi)型元組。設(shè)置時(shí)候也是以元組或列表對(duì)其進(jìn)行設(shè)置,格式也是值 、類(lèi)型。其中類(lèi)型可以是 REG_SZ、REG_EXPAND_SZ、REG_DWORD等合法的類(lèi)型。
該類(lèi)提供了上下文的訪(fǎng)問(wèn)方法,可以在 with 中使用,以簡(jiǎn)化編程,使用方法見(jiàn)示例。
該模塊提供了幾個(gè) HKCU、HKLM 等常量供初始化。