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