此代码曾用于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设置为默认和从不进行测试所确认的那样)。
答案 0 :(得分:2)
这是用户错误,由Windows 7中的更改与UAC功能的实现方式相结合或触发。
在Vista中,备受诟病的用户访问控制功能是二进制的,无论是打开还是关闭。在已更改为提供四个粒度级别的Windows 7上:
我的错误是在将UAC功能下降到Never Notify级别后没有重启。 (Vista很苛刻地要求你重新启动,而Windows 7似乎稍微更加被动。)
答案 1 :(得分:1)
我认为您有访问权限问题。
尝试以较低要求的访问权限(例如KEY_QUERY_VALUE
)打开密钥,并检查其是否有效。
当然,通过该更改,您将无法更改注册表,但这仅用于查明问题
作为替代方案,尝试从具有更高权限的用户执行该实用程序 - 顺便说一下,这将是我可以看到的涉及访问权限的问题的唯一解决方案。