我正在尝试使用Python中的WinReg,但我遇到了一个障碍。下面的代码应该返回一个带有键的字典:每个返回的条目的值,我发现自己得到了相同的键:值。
如何编辑此代码以获取不同的值?
{'Mozilla Firefox 40.0.2 (x86 en-US)': 'Mozilla Firefox 40.0.2 (x86 en-US)', 'IE40': 'IE40', 'Connection Manager': 'Connection Manager'}
输出与此类似:
{{1}}
任何帮助都将不胜感激,请记住,我不是一个高级的蟒蛇。
答案 0 :(得分:1)
每次递归到traverse_registry_tree
函数时,都会创建一个新词典。所以每个字典只有一个密钥。
你可以告诉这是错误的,因为在递归调用中你没有对返回值做任何事情:外部调用打印返回但内部调用没有。
您可以通过将递归调用的返回值打包回您正在创建的字典中来解决此问题。但这并不像将整个字典传入和传出递归调用那样高效:
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)