Python - Winreg 获取键值

Python - Winreg get key values

我正尝试在 Python 中使用 WinReg,但我遇到了障碍。下面的代码应该 return 一个字典,每个 returned 条目都有一个 key:value,我发现自己得到相同的 key:value.

如何编辑此代码以获得一个或多个不同的值?

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)

输出与此类似:

{'Mozilla Firefox 40.0.2 (x86 en-US)': 'Mozilla Firefox 40.0.2 (x86 en-US)', 'IE40': 'IE40', 'Connection Manager': 'Connection Manager'}

任何帮助将不胜感激,请记住我不是高级 pythonist。

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

你可以看出这是错误的,因为在递归调用中你没有对 return 值做任何事情:外部调用打印 return 但内部调用没有.

您可以通过将递归调用中的 return 值打包回您正在创建的字典中来解决此问题。但这不如将整个字典传入和传出递归调用有效:

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)

不确定您是否也在询问如何访问注册表值(以及密钥)?如果是这样,这里也有一些代码可以做到这一点:

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)