Python:在Windows 7上使用\u winreg编辑注册表值时出现Windows错误

2024-05-19 19:18:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试执行nedbatchelder的this script,以便在Windows上的两个Python安装之间切换.py文件关联。这个Python脚本使用^{}模块(python3.x中的winreg)编辑某些注册表值(修改后的路径和值对可以在脚本中的todo列表中看到)。在

我执行以下脚本:

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

我得到以下错误:

^{pr2}$

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

  • 上面使用的帐户是Administrators组的一部分,具有管理员权限。

  • 使用上述帐户,我可以执行regedit.exe并手动设置脚本中列出的值,而不必面对任何权限或访问问题。

我正在使用Windows 7,并且是域的一部分。这些可能和这个问题有关吗?在

有人知道这个错误吗?如何运行此脚本?在


Tags: 模块文件py脚本权限编辑注册表windows
2条回答

当我尝试这个方法时,我在Python.CompiledFile上得到“Path not found”错误。在

我在我的注册表上查过了,它不存在,但不是Windows7。在

所以,我删除了Python.CompiledFile的行,它在这里运行得很好,或者

您可以将try: except:放在OpenKey和SetValue上,但这不是个好主意。在

我可以通过使用“以管理员身份运行”打开命令提示符来运行脚本。在

如果您使用提升的权限运行脚本,您似乎只能维护HKEY\U LOCAL U MACHINE条目。在

根据this MSDN link,一些HKEY\U类根项来自HKEY\U LOCAL U MACHINE:

The HKEY_CLASSES_ROOT subtree is a view formed by merging HKEY_CURRENT_USER\Software\Classes and 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)

相关问题 更多 >