winreg.OpenKey 为现有注册表项抛出 filenotfound 错误

winreg.OpenKey throws filenotfound error for existing registry keys

我在读取由我的软件创建的注册表项时遇到困难。但是,使用相同的代码,我能够读取其他键。

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

任何帮助将不胜感激

注册表有 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