5

Windows 上の 2 つの Python インストール間のファイル関連付けを切り替えるために、Ned Batchelder によるこのスクリプトを実行しようとしています。.pyこの Python スクリプトは、_winregモジュール ( Python 3.x の場合) を使用して、特定のレジストリwinreg値を編集します (変更されたパスと値のペアは、スクリプトのリストに表示されます)。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

「管理者として実行」を使用してコマンドプロンプトを開くことで、スクリプトを実行できました。

昇格された権限でスクリプトを実行する場合、HKEY_LOCAL_MACHINE エントリのみを維持できるようです。

HKEY_CLASSES_ROOT エントリの一部は、この MSDN リンクに従って HKEY_LOCAL_MACHINE から取得されます。

HKEY_CLASSES_ROOT サブツリーは、HKEY_CURRENT_USER\Software\Classes と HKEY_LOCAL_MACHINE\Software\Classes をマージして形成されたビューです。

スクリプトを更新して、追加のフィードバック用のいくつかの print ステートメントに加えて、提案された 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 に答える