此代码过去适用于 Vista(和 Windows XP),但在升级到 Windows 7 后,它现在失败并显示错误:
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on win32
>>> import _winreg
>>> h1 = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
>>> key = r'SOFTWARE\Python\PythonCore\2.6\InstallPath'
>>> h2 = _winreg.OpenKey(h1, key, 0, _winreg.KEY_ALL_ACCESS)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
WindowsError: [Error 5] Access is denied
我相当确定这是 Windows 7 中安全模型更改的结果,但我尝试过的各种搜索都没有找到任何我可以用作答案的东西。
(不是说它应该是相关的,而是为了避免“你为什么要那样做?”的回应,这是一个开发人员的实用程序,它可以在多个 Python 安装之间切换注册表,用于多项目环境我们需要更多地控制正在使用的 Python 版本以及可用的包,而不是 virtualenv 之类的东西。)
编辑:登录用户是管理员。此外,我已尽可能完全关闭 UAC(用户访问控制)功能(不正确...请参阅下一篇编辑),就像从 Vista 升级到 Windows 之前的情况一样7.
编辑 2: 正如我在下面的回答中所指出的,关闭 UAC 后我没有重新启动,所以它仍然设置为默认值。显然,这会导致访问被拒绝错误(正如我通过将 UAC 设置为默认和从不进行测试所确认的那样)。
最佳答案
这是一个用户错误,由 Windows 7 中对 UAC 功能实现方式的更改而加剧或触发。
在 Vista 中,令人厌恶的用户访问控制功能是二进制的,可以打开或关闭。在 Windows 7 上已更改为提供四个级别的粒度:
- 始终通知(当程序或用户试图更改设置时)
- 默认(仅在程序尝试进行更改并调暗屏幕时通知)
- 不调暗通知(与默认设置相同,但通知时不调暗屏幕)
- 从不通知(程序或用户更改)
我的错误是在将 UAC 功能降低到从不通知级别后没有重新启动。 (Vista 主动要求您重新启动,而 Windows 7 似乎稍微被动一些。)
关于python - 在 Windows 7 上打开注册表项时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1897324/