【问题标题】:Python _winreg woesPython _winreg 问题
【发布时间】:2012-02-19 12:00:53
【问题描述】:

我正在尝试访问 Windows 注册表(在 Python 中)以使用 _winreg 查询键值,但我无法让它工作。以下行返回一个 WindowsError 表示“系统找不到指定的文件”:

key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Autodesk\Maya\2012\Setup\InstallPath', 0, _winreg.KEY_ALL_ACCESS)

经过数小时的尝试,Python 似乎无法看到路径的“Maya”部分之外(看起来“2012\...etc...”子路径“不可见”或不存在)。现在我打开了注册表编辑器,我保证在 HKLM 中有这样的路径。我在 Windows 7 64 位。知道我做错了什么吗?这让我发疯了。谢谢...

【问题讨论】:

  • 你解决了这个问题吗?
  • 我想是的。老实说,我不记得我最后是怎么做的。也许我以某种方式绕过了这个问题。抱歉,我帮不上什么忙……

标签: python winreg


【解决方案1】:

您需要将访问密钥与 64 位访问密钥之一结合起来。

_winreg.KEY_WOW64_64KEY 表示 64 位 Windows 上的应用程序应在 64 位注册表视图上运行。

_winreg.KEY_WOW64_32KEY 表示 64 位 Windows 上的应用程序应在 32 位注册表视图上运行。

试试:

_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Autodesk\Maya\2012\Setup\InstallPath', 0, (_winreg.KEY_WOW64_64KEY + _winreg.KEY_ALL_ACCESS))

【讨论】:

  • 我遇到了无法枚举子键的问题。像你说的那样添加 KEY_WOW64_64KEY 解决了我的问题。谢谢。
【解决方案2】:

您还使用 64 位版本的 Python,还是 32 位版本的 Python? (后者更常见。)如果您使用的是 32 位版本的 Python,_winreg 模块将默认看到 32 位注册表,而 regedit 将显示 64 位注册表。您应该可以告诉_winreg 打开不同的视图;请参阅有关访问权限的_winreg 模块文档,特别是subsection on 64-bit specific flags 和the MSDN article it references。不幸的是,32 位进程似乎无法访问 64 位注册表,但我可能遗漏了一些东西。

【讨论】:

  • 感谢您的回复。当我检查我拥有的 Python 版本(使用 sys.version_info)时,它会显示 (2, 6, 4, 'final', 0)。我看不到任何 64 位或 32 位信息。另一件事是我不知道在哪里使用“KEY_WOW64_64KEY”部分。我知道,我可能听起来很可怜​​,但我确实需要帮助......
  • 您在sys.version_info 中看不到 32 位与 64 位,但您可以在 sys.version 中看到它(其中会显示“32 位”或“64 位” .) 你也可以看看platform.architecture()。至于以不同的方式打开注册表,正如我所说,我不相信您可以从 32 位进程访问 64 位注册表,就像您可以从 64 位进程访问一样。但是,我可能是错的;我从来没有对 32 位注册表访问做过很多事情。
  • @ThomasWouters :我也无法在 Windows 7 64 位和 python 2.7.3 上使用 _winreg 读取密钥(默认,2012 年 4 月 10 日, 23:24:47) [MSC v.1500 64 位 (AMD64)]。我得到与@user1219144 相同的错误系统找不到指定的文件。为了对此进行测试,我将WindowsRegistry class 与测试用例一起使用。我看到的行为:1st 运行正常; 2nd 运行正常; 重启后错误。调试:尝试以管理员身份运行 IDLE,方法是将 START C:\Python27\pythonw.exe C:\Python27\Lib\idlelib\idle.py 放入 .bat 文件,右键单击它然后选择 以管理员身份运行跨度>
  • ... 然后打开 WindowsRegistry.py 类,并按 F5 运行测试用例
  • @TrinitronX:我无法在 Windows 7 64 位和 python 2.7.3(64 位)上使用 _winreg 读取系统上的任何“HKEY_LOCAL_MACHINE”键。像_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "\SOFTWARE\Microsoft\Microsoft SDKs\Windows") 这样简单的东西是行不通的。我也尝试了所有可能的 WOW 标志。在工作系统和家庭系统上进行了尝试。用 Python 3.3 试过了。我不知道出了什么问题。如果我尝试访问 HKEY_CLASSES_ROOT 东西,效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多