如何使用 Python 訪(fǎng)問(wèn)注冊(cè)表

如果用 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 等常量供初始化。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容