Параметры winreg для получения PATH в Windows 10 - PullRequest
0 голосов
/ 07 января 2020

Чтобы извлечь содержимое переменной %PATH% на компьютере Windows 10 Home edition, какие значения следует использовать для параметров key, subkey и name в следующем сценарии Python ?

import winreg

def _get_reg_value(key, subkey, name):
    """Return registry value specified by key, subkey, and name.

    Environment variables in values of type REG_EXPAND_SZ are expanded
    if possible.
    """

    key = _winreg.OpenKey(key, subkey)
    try:
        ret = _winreg.QueryValueEx(key, name)
    except WindowsError:
        return None

    else:
        key.Close()
        if ret[1] == _winreg.REG_EXPAND_SZ:
            return expandvars(ret[0])

        else:
            return ret[0] 

Обратите внимание, что мы не используем os.environ здесь, потому что нам нужно взаимодействовать со значениями постоянного пути, а не только со значениями времени выполнения, которые предоставляются os.environ.

Пример кода выше от этой ссылки . Я использую его для изучения того, как программно взаимодействовать с Windows Реестром, используя Python.


Неудачная попытка:

Когда я вызываю вышеуказанную функцию, используя следующий синтаксис в файле .py, запускаемом из Windows CMD, все, что возвращается - пустая строка в Windows CMD, за которой следует командная строка. Как будто ничего не случилось.

key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r'SYSTEM\CurrentControlSet\Control\Session Manager')

_get_reg_value(key, 'Environment', 'Path')  

1 Ответ

1 голос
/ 09 января 2020

Если Python winreg библиотека просто оборачивает соответствующие Windows API, то вам нужно открыть каждый компонент ключа . Вы не можете сказать:

winreg.OpenKey(winreg::HKEY_LOCAL_MACHINE, "FOO\\BAR")

Вместо этого сначала нужно открыть FOO, а затем открыть BAR:

foo_key = winreg.OpenKey(winreg::HKEY_LOCAL_MACHINE, "FOO")
bar_key = winreg.OpenKey(foo_key, "BAR")

Это, вероятно, root вашей проблемы.

Но тут может быть что-то еще. После внесения такого изменения вы должны передать WM_SETTINGCHANGE , чтобы другие процессы (например, оболочка) знали, как сделать недействительными свои кэши и перечитать системные настройки. Вероятно, командлет PowerShell делает это автоматически.

Могут быть и другие проблемы. Например, если вы используете 32-битный Python в 64-битной ОС, вы можете столкнуться с перенаправлением реестра, в зависимости от того, к каким именно частям улья вы пытаетесь получить доступ.

Чтобы уточнить, что вы называете "постоянными значениями пути", является частью системных переменных среды . Если у вас есть права (например, от имени администратора), вы правы в том, что вы можете изменить путь из блока системной среды по этим ключам.

Система объединяет переменные пользовательской среды с переменными системной среды. Если PATH определен в обеих средах, конечный PATH - это конкатенация системных значений, за которыми следуют пользовательские значения. Для других переменных с системным и пользовательским определением (например, TMP) используются пользовательские значения.

Дочерние процессы наследуют копию среды своего родительского процесса. Таким образом, даже с трансляцией WM_SETTINGCHANGE они, вероятно, не обновят свой путь, чтобы отразить изменения, которые вы внесли в блок системной среды.

...