首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python - Winreg获取键值

Python - Winreg获取键值
EN

Stack Overflow用户
提问于 2015-08-23 20:55:29
回答 1查看 6.8K关注 0票数 1

我正在尝试使用Python中的WinReg,但我面临着一个障碍。下面的代码应该为每个返回的条目返回一个带有键:value的字典,我发现自己得到了相同的键:value。

如何编辑这段代码以获得不同的值或值?

代码语言:javascript
复制
import _winreg
def subkeys(key):
    i = 0
    while True:
        try:
            subkey = _winreg.EnumKey(key, i)
            yield subkey
            i+=1
        except WindowsError as e:
            break

def traverse_registry_tree(hkey, keypath, tabs=0):
    reg_dict = {}
    key = _winreg.OpenKey(hkey, keypath, 0, _winreg.KEY_READ)
    for subkeyname in subkeys(key):
        reg_dict[subkeyname] = subkeyname
    return reg_dict

keypath = r"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"

print traverse_registry_tree(_winreg.HKEY_LOCAL_MACHINE, keypath)

输出与此类似:

代码语言:javascript
复制
{'Mozilla Firefox 40.0.2 (x86 en-US)': 'Mozilla Firefox 40.0.2 (x86 en-US)', 'IE40': 'IE40', 'Connection Manager': 'Connection Manager'}

任何帮助都会感激的,请记住我不是一个先进的侏儒。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-24 07:07:07

每次您在traverse_registry_tree函数中递归时,都会创建一个新的字典。所以每本字典里只有一个键。

您可以判断这是错误的,因为在递归调用中,您不会对返回值做任何事情:外部调用打印返回,而内部调用没有。

您可以通过将递归调用的返回值打包到正在创建的字典中来修复这个问题。但是,这并不像在递归调用中来回传递整个字典那样有效:

代码语言:javascript
复制
def traverse_registry_tree(hkey, keypath, reg_dict):
    key = _winreg.OpenKey(hkey, keypath, 0, _winreg.KEY_READ)
    reg_dict[keypath] = key
    for subkey in subkeys(key):
        subkeypath = "%s\\%s" % (keypath, subkey)
        traverse_registry_tree(hkey, subkeypath, reg_dict)

reg_dict = {}
keypath = r"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
traverse_registry_tree(_winreg.HKEY_LOCAL_MACHINE, keypath, reg_dict)

print(reg_dict)

不确定您是否也在询问如何访问注册表值(以及键)?如果是这样的话,下面也有一些代码可以这样做:

代码语言:javascript
复制
def get_values(key):
    key_dict = {}
    i = 0
    while True:
        try:
            subvalue = _winreg.EnumValue(key, i)
        except WindowsError as e:
            break
        key_dict[subvalue[0]] = subvalue[1:]
        i+=1
    return key_dict

def traverse_registry_tree(hkey, keypath, reg_dict):
    key = _winreg.OpenKey(hkey, keypath, 0, _winreg.KEY_READ)
    reg_dict[keypath] = get_values(key)
    for subkey in subkeys(key):
        subkeypath = "%s\\%s" % (keypath, subkey)
        traverse_registry_tree(hkey, subkeypath, reg_dict)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32171448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档