我在阅读由我的软件创建的注册表项时遇到困难。但是使用相同的代码,我可以读取其他键。
installdir = winreg.OpenKey(
winreg.HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\MediaPlayer\\Player\\Extensions\\Types"
) #this works perfect
#installdir1 = winreg.OpenKey(
winreg.HKEY_LOCAL_MACHINE,
"SOFTWARE\\MySoftware\\MyEvent\\IS"
) #this gives Filenotfound error
# list values owned by this registry key
try:
i = 0
while 1:
name, value, type = winreg.EnumValue(installdir, i)
print (repr(name))
i += 1
except WindowsError:
print ("Bot donf")
value, type = winreg.QueryValueEx(installdir, "10")
print("user is", repr(value))
value, type = winreg.QueryValueEx(winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS"), "v2")
print("user is", repr(value))
回溯显示
Traceback (most recent call last):
File "D:/python_scripts/myclass.py", line 32, in <module>
value, type = winreg.QueryValueEx(winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS"), "v2")
FileNotFoundError: [WinError 2] The system cannot find the file specified
但是,Windows reg查询能够检索值集。
#reg query HKLM\SOFTWARE\MySoftware\MyEvent\IS /v v2
HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware\MyEvent\IS
v2 REG_DWORD 0x12
任何帮助都将受到高度赞赏
答案 0 :(得分:15)
注册表有2个视图。有32位注册表视图和64位注册表视图。默认情况下,在大多数情况下,32位应用程序只能看到32位注册表视图,而64位应用程序只能看到64位注册表视图。
可以使用KEY_WOW64_64KEY或KEY_WOW64_32KEY访问标志访问其他视图。
如果您运行的是32位python并且您的密钥是64位注册表视图的一部分,那么您应该使用类似的东西来打开密钥:
winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | winreg.KEY_WOW64_64KEY)
如果您正在运行64位python并且您的密钥是32位注册表视图的一部分,那么您应该使用类似的东西来打开密钥:
winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | winreg.KEY_WOW64_32KEY)
如果您知道密钥始终是同一视图的一部分,那么添加正确的KEY_WOW64_*
访问标志将确保无论您的python架构是什么,它都能正常工作。
在最常见的情况下,如果你有可变的python架构并且你事先不知道密钥将在哪个视图中,你可以尝试在当前视图中找到密钥并尝试下一个其他视图。它可能看起来像这样:
try:
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS")
except FileNotFoundError:
import platform
bitness = platform.architecture()[0]
if bitness == '32bit':
other_view_flag = winreg.KEY_WOW64_64KEY
elif bitness == '64bit':
other_view_flag = winreg.KEY_WOW64_32KEY
try:
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | other_view_flag)
except FileNotFoundError:
'''
We really could not find the key in both views.
'''
有关详细信息,请查看Accessing an Alternate Registry View。