winreg.OpenKey为现有注册表项引发filenotfound错误

时间:2015-06-19 07:52:21

标签: python python-3.x registry winreg

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

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

任何帮助都将受到高度赞赏

1 个答案:

答案 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

相关问题