Python:在Windows 7上使用_winreg编辑注册表值时的WindowsError

时间:2009-12-04 08:35:19

标签: python windows-7 registry winreg

我正在尝试由Ned Batchelder执行this script,以便在Windows上的两个Python安装之间切换.py文件关联。此Python脚本使用_winreg模块(Python 3.x中的winreg)来编辑某些 Registry 值(修改后的路径和值对可以在{{1}中看到脚本中的列表)。

我按如下方式执行此脚本:

todo

我收到以下错误:

> SwitchPy.py "C:\Program Files\Python26"

我猜这可能与帐户权限有关。但请注意:

  • 上面使用的帐户是Traceback (most recent call last): File "C:\Users\SuperUser\SwitchPy.py", line 30, in <module> key = reg.OpenKey(classes_root, path, 0, reg.KEY_SET_VALUE) WindowsError: [Error 5] Access is denied 群组的一部分,并具有管理员权限。

  • 使用上述帐户,我可以执行Administrators并手动设置脚本中列出的值,而不会遇到任何权限或访问问题。

我正在使用Windows 7并且是域名的一部分。这可能与这个问题有什么关系吗?

有没有人对此错误有任何疑问?如何让这个脚本运行?

2 个答案:

答案 0 :(得分:0)

当我尝试那个时,我在Python.CompiledFile上找到了“未找到路径”错误。

我在我的注册表上检查过,它不存在,但不是Windows 7。

所以,我在这里删除了Python.CompiledFile及其正常运行的那些行,或者

你可以把try: except:放在OpenKey和SetValue上,但不是好主意。

答案 1 :(得分:0)

我可以通过使用&#34;以管理员身份运行&#34;打开命令提示符来运行脚本。

如果您使用提升的权限运行脚本,则似乎只能维护HKEY_LOCAL_MACHINE条目。

根据JSFiddle,部分HKEY_CLASSES_ROOT条目来自HKEY_LOCAL_MACHINE:

  

HKEY_CLASSES_ROOT子树是通过合并HKEY_CURRENT_USER \ Software \ Classes和HKEY_LOCAL_MACHINE \ Software \ Classes

形成的视图

我更新了脚本以包含建议的try / except以及一些打印语句以获得额外的反馈。

以下是我更新脚本的方法:

""" Change the .py file extension to point to a different
    Python installation.
"""
import _winreg as reg
import sys

pydir = sys.argv[1]

todo = [
    ('Applications\python.exe\shell\open\command',
                '"PYDIR\\python.exe" "%1" %*'),
    ('Applications\pythonw.exe\shell\open\command',
                '"PYDIR\\pythonw.exe" "%1" %*'),
    ('Python.CompiledFile\DefaultIcon',
                'PYDIR\\pyc.ico'),
    ('Python.CompiledFile\shell\open\command',
                '"PYDIR\\python.exe" "%1" %*'),
    ('Python.File\DefaultIcon',
                'PYDIR\\py.ico'),
    ('Python.File\shell\open\command',
                '"PYDIR\\python.exe" "%1" %*'),
    ('Python.NoConFile\DefaultIcon',
                'PYDIR\\py.ico'),
    ('Python.NoConFile\shell\open\command',
                '"PYDIR\\pythonw.exe" "%1" %*'),
    ]

classes_root = reg.OpenKey(reg.HKEY_CLASSES_ROOT, "")
for path, value in todo:
    print "Updating %s with %s" % (path, value.replace('PYDIR', pydir))
    try:
        key = reg.OpenKey(classes_root, path, 0, reg.KEY_SET_VALUE)
        reg.SetValue(key, '', reg.REG_SZ, value.replace('PYDIR', pydir))
    except:
        print "Unable to maintain %s\n" % (path)