我正在尝试由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并且是域名的一部分。这可能与这个问题有什么关系吗?
有没有人对此错误有任何疑问?如何让这个脚本运行?
答案 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)