5

我正在尝试由 Ned Batchelder 执行此脚本.py,以在 Windows 上的两个 Python 安装之间切换文件关联。此 Python 脚本使用_winreg模块(winreg在 Python 3.x 中)来编辑某些注册表值(修改的路径和值对可以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组的一部分并具有管理员权限。

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

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

有人对这个错误有任何线索吗?如何让这个脚本运行?

4

2 回答 2

0

当我尝试那个时,我收到“找不到路径”错误Python.CompiledFile

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

所以,我删除了这些行,Python.CompiledFile并且在这里运行良好,或者

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

于 2009-12-04T08:55:34.760 回答
0

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

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

根据此 MSDN 链接,一些 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)
于 2016-10-21T19:51:14.237 回答