如何使用 Python 访问注册表

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

    原文作者:远飞的大雁2010
    原文地址: https://www.jianshu.com/p/176f3f936b5d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞