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

Python winreg.OpenKey为现有注册表项抛出filenotfound错误,python,python-3.x,registry,winreg,Python,Python 3.x,Registry,Winreg,我在读取由我的软件创建的注册表项时遇到困难。但是,使用相同的代码,我可以读取其他键 installdir = winreg.OpenKey( winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\MediaPlayer\\Player\\Extensions\\Types" ) #th

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

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

如有任何帮助,将不胜感激。

注册表有两个视图。有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)
winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | winreg.KEY_WOW64_32KEY)
如果您运行的是64位python,并且您的注册表项是32位注册表视图的一部分,则应使用类似以下内容来打开注册表项:

winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | winreg.KEY_WOW64_64KEY)
winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\MySoftware\\MyEvent\\IS", access=winreg.KEY_READ | winreg.KEY_WOW64_32KEY)
如果您知道密钥始终是同一视图的一部分,那么添加适当的
key\u WOW64\u*
access标志将确保无论您的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.
        '''

有关更多信息,请查看。

编辑了req查询语句中的输入错误。但这无论如何都不应该是个问题。这个答案的美妙之处在于,它是在2年前写好的,即使是现在也没有被编辑过。干得好@Remy RoyAwesome回答!!非常感谢,谢谢。添加_winreg.KEY\u WOW64\u 64KEY有助于访问“软件\\Microsoft\\MSBuild\\ToolsVersions\\4.0”