> **Источник:** https://python-all.ru/3.0/library/winreg.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `winreg` – доступ к реестру Windows

*Платформы:* Windows

Эти функции предоставляют доступ к Windows registry API из Python. Вместо целого числа в качестве дескриптора реестра используется объект-дескриптор, чтобы гарантировать корректное закрытие дескрипторов, даже если программист забудет явно закрыть их.

Этот модуль предоставляет очень низкоуровневый интерфейс к реестру Windows; ожидается, что в будущем будет создан новый модуль `winreg`, предлагающий более высокоуровневый интерфейс к API реестра.

Этот модуль предоставляет следующие функции:

#### `[winreg.CloseKey]winreg.CloseKey(hkey)`

Закрывает ранее открытый ключ реестра. Аргумент hkey задаёт ранее открытый ключ.

Обратите внимание, что если *hkey* не был закрыт с помощью этого метода (или через `handle.Close()`), он закрывается, когда объект *hkey* уничтожается Python.

#### `[winreg.ConnectRegistry]winreg.ConnectRegistry(computer_name, key)`

Устанавливает соединение с предопределённым дескриптором реестра на другом компьютере и возвращает *объект-дескриптор*

*computer\_name* – это имя удалённого компьютера, в форме `r"\\computername"`. Если `None`, используется локальный компьютер.

*key* – это предопределенный дескриптор для подключения.

Возвращаемое значение – дескриптор открытого ключа. Если функция завершается ошибкой, возбуждается исключение [`EnvironmentError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EnvironmentError).

#### `[winreg.CreateKey]winreg.CreateKey(key, sub_key)`

Создаёт или открывает указанный ключ, возвращая *объект-дескриптор*

*key* – это уже открытый ключ или одна из предопределённых констант `HKEY_*`.

*sub\_key* – строка, задающая имя ключа, который этот метод открывает или создаёт.

Если *key* – один из предопределённых ключей, *sub\_key* может быть `None`. В этом случае возвращаемый дескриптор – это тот же дескриптор ключа, который был передан функции.

Если ключ уже существует, эта функция открывает существующий ключ.

Возвращаемое значение – дескриптор открытого ключа. Если функция завершается ошибкой, возбуждается исключение [`EnvironmentError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EnvironmentError).

#### `[winreg.DeleteKey]winreg.DeleteKey(key, sub_key)`

Удаляет указанный ключ.

*key* – уже открытый ключ или любая из предопределённых констант `HKEY_*`.

*sub\_key* – это строка, которая должна быть подключом ключа, указанного *key* параметром. Это значение не должно быть `None`, и ключ не может содержать подключи.

*Этот метод не может удалять ключи, содержащие подразделы.*

Если метод выполняется успешно, удаляется весь ключ, включая все его значения. Если метод завершается ошибкой, возбуждается исключение [`EnvironmentError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EnvironmentError).

#### `[winreg.DeleteValue]winreg.DeleteValue(key, value)`

Удаляет именованное значение из ключа реестра.

*key* – уже открытый ключ или одна из предопределённых констант `HKEY_*`.

*value* – это строка, определяющая значение, которое нужно удалить.

#### `[winreg.EnumKey]winreg.EnumKey(key, index)`

Перечисляет подразделы открытого ключа реестра, возвращая строку.

*key* – уже открытый ключ или любая из предопределённых констант `HKEY_*`.

*index* – целое число, идентифицирующее индекс извлекаемого ключа.

Функция извлекает имя одного подключа при каждом вызове. Обычно она вызывается повторно до тех пор, пока не будет возбуждено исключение [`EnvironmentError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EnvironmentError), указывающее на отсутствие других значений.

#### `[winreg.EnumValue]winreg.EnumValue(key, index)`

Перечисляет значения открытого ключа реестра, возвращая кортеж.

*key* – уже открытый ключ или любая из предопределённых констант `HKEY_*`.

*index* – целое число, идентифицирующее индекс извлекаемого значения.

Функция извлекает имя одного подключа при каждом вызове. Обычно она вызывается повторно, пока не будет возбуждено исключение [`EnvironmentError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EnvironmentError), указывающее на отсутствие значений.

Результат – кортеж из 3 элементов:

| Индекс | Значение |
| --- | --- |
| `0` | Строка, идентифицирующая имя значения. |
| `1` | Объект, содержащий данные значения, и его тип зависит от базового типа раздела реестра. |
| `2` | Целое число, идентифицирующее тип данных значения. |

#### `[winreg.ExpandEnvironmentStrings]winreg.ExpandEnvironmentStrings(unicode)`

Разворачивает строки окружения %NAME% в строке Unicode, как константа *REG\_EXPAND\_SZ*:

```python
>>> ExpandEnvironmentStrings(u"%windir%")
u"C:\\Windows"
```

#### `[winreg.FlushKey]winreg.FlushKey(key)`

Записывает все атрибуты раздела в реестр.

*key* – уже открытый ключ или одна из предопределённых констант `HKEY_*`.

It is not necessary to call [`FlushKey()`](https://python-all.ru/3.0/library/winreg.html#winreg.FlushKey) to change a key. Registry changes are flushed to disk by the registry using its lazy flusher. Registry changes are also flushed to disk at system shutdown. Unlike [`CloseKey()`](https://python-all.ru/3.0/library/winreg.html#winreg.CloseKey), the [`FlushKey()`](https://python-all.ru/3.0/library/winreg.html#winreg.FlushKey) method returns only when all the data has been written to the registry. An application should only call [`FlushKey()`](https://python-all.ru/3.0/library/winreg.html#winreg.FlushKey) if it requires absolute certainty that registry changes are on disk.

> **Примечание**
>
> Если неизвестно, необходим ли вызов [`FlushKey()`](https://python-all.ru/3.0/library/winreg.html#winreg.FlushKey), то, скорее всего, он не нужен.

#### `[winreg.LoadKey]winreg.LoadKey(key, sub_key, file_name)`

Создаёт подключ под указанным ключом и сохраняет информацию регистрации из указанного файла в этот подключ.

*key* – уже открытый ключ или любая из предопределённых констант `HKEY_*`.

*sub\_key* – строка, идентифицирующая загружаемый подключ.

*file\_name* – это имя файла, из которого загружаются данные реестра. Этот файл должен быть создан функцией [`SaveKey()`](https://python-all.ru/3.0/library/winreg.html#winreg.SaveKey). В файловой системе FAT (file allocation table) имя файла не может содержать расширение.

Вызов LoadKey() завершается ошибкой, если вызывающий процесс не имеет привилегии `SE_RESTORE_PRIVILEGE`. Обратите внимание: привилегии отличаются от разрешений – подробнее см. в документации Win32.

Если *key* – дескриптор, возвращённый [`ConnectRegistry()`](https://python-all.ru/3.0/library/winreg.html#winreg.ConnectRegistry), то путь, указанный в *fileName*, является относительным для удалённого компьютера.

В документации Win32 подразумевается, что *key* должен находиться в ветке `HKEY_USER` или `HKEY_LOCAL_MACHINE`. Это может быть как верно, так и нет.

#### `[winreg.OpenKey]winreg.OpenKey(key, sub_key[, res=0][, sam=KEY_READ])`

Открывает указанный ключ, возвращая *объект-дескриптор*

*key* – уже открытый ключ или любая из предопределённых констант `HKEY_*`.

*sub\_key* – это строка, идентифицирующая открываемый подраздел.

*res* – зарезервированное целое число, должно быть равно нулю. По умолчанию – ноль.

*sam* – целое число, задающее маску доступа, описывающую требуемый уровень безопасности для ключа. По умолчанию `KEY_READ`

Результат – новый дескриптор указанного раздела.

Если функция завершается ошибкой, возбуждается исключение [`EnvironmentError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EnvironmentError).

#### `[winreg.OpenKeyEx]winreg.OpenKeyEx()`

Функциональность

[`OpenKeyEx()`](https://python-all.ru/3.0/library/winreg.html#winreg.OpenKeyEx)

предоставляется через

[`OpenKey()`](https://python-all.ru/3.0/library/winreg.html#winreg.OpenKey)

с использованием аргументов по умолчанию.

#### `[winreg.QueryInfoKey]winreg.QueryInfoKey(key)`

Возвращает информацию о разделе в виде кортежа.

*key* – уже открытый ключ или одна из предопределённых констант `HKEY_*`.

Результат – кортеж из 3 элементов:

| Индекс | Значение |
| --- | --- |
| `0` | Целое число, указывающее количество подразделов, которые есть у этого раздела. |
| `1` | Целое число, указывающее количество значений, которые есть у этого раздела. |
| `2` | Целое число, указывающее время последнего изменения ключа (если доступно), в сотнях наносекунд с 1 января 1600 года. |

#### `[winreg.QueryValue]winreg.QueryValue(key, sub_key)`

Извлекает безымянное значение ключа в виде строки

*key* – уже открытый ключ или одна из предопределённых констант `HKEY_*`.

*sub\_key* – строка, содержащая имя подключа, с которым связано значение. Если этот параметр равен `None` или пуст, функция извлекает значение, заданное методом [`SetValue()`](https://python-all.ru/3.0/library/winreg.html#winreg.SetValue) для ключа, определяемого *key*.

Значения в реестре имеют компоненты имени, типа и данных. Этот метод извлекает данные для первого значения ключа с именем NULL. Однако нижележащий вызов API не возвращает тип. Некруто, некруто, некруто – НЕ ИСПОЛЬЗУЙТЕ ЭТОТ МЕТОД!!!

#### `[winreg.QueryValueEx]winreg.QueryValueEx(key, value_name)`

Извлекает тип и данные для указанного имени значения, связанного с открытым ключом реестра.

*key* – уже открытый ключ или одна из предопределённых констант `HKEY_*`.

*value\_name* – строка, указывающая имя запрашиваемого значения.

Результат – кортеж из 2 элементов:

| Индекс | Значение |
| --- | --- |
| `0` | Значение элемента реестра. |
| `1` | Целое число, задающее тип реестра для этого значения. |

#### `[winreg.SaveKey]winreg.SaveKey(key, file_name)`

Сохраняет указанный раздел и все его подразделы в указанный файл.

*key* – уже открытый ключ или одна из предопределённых констант `HKEY_*`.

*file\_name* – это имя файла, в который будут сохранены данные реестра. Этот файл не должен существовать. Если имя файла содержит расширение, его нельзя использовать в файловых системах с таблицей размещения файлов (FAT) методами [`LoadKey()`](https://python-all.ru/3.0/library/winreg.html#winreg.LoadKey), `ReplaceKey()` или `RestoreKey()`.

Если *key* представляет раздел на удалённом компьютере, то путь, задаваемый *file\_name*, указывается относительно этого удалённого компьютера. Вызывающий этот метод должен обладать привилегией безопасности `SeBackupPrivilege`. Обратите внимание: привилегии отличаются от разрешений – подробнее см. в документации Win32.

Эта функция передаёт NULL для *security\_attributes* в API.

#### `[winreg.SetValue]winreg.SetValue(key, sub_key, type, value)`

Связывает значение с указанным разделом.

*key* – это уже открытый раздел или одна из предопределённых констант `HKEY_*`.

*sub\_key* – это строка, задающая имя подраздела, с которым связано значение.

*type* – это целое число, задающее тип данных. В настоящее время это должен быть `REG_SZ`, то есть поддерживаются только строки. Для работы с другими типами данных используйте функцию [`SetValueEx()`](https://python-all.ru/3.0/library/winreg.html#winreg.SetValueEx).

*value* – это строка, задающая новое значение.

Если раздел, указанный параметром *sub\_key*, не существует, функция SetValue создаёт его.

Длина значений ограничена доступной памятью. Длинные значения (более 2048 байт) следует хранить в виде файлов, имена которых сохраняются в конфигурационном реестре. Это помогает реестру работать эффективно.

Раздел, указанный параметром *key*, должен быть открыт с правом доступа `KEY_SET_VALUE`.

#### `[winreg.SetValueEx]winreg.SetValueEx(key, value_name, reserved, type, value)`

Сохраняет данные в поле значения открытого ключа реестра.

*key* – это уже открытый раздел или одна из предопределённых констант `HKEY_*`.

*value\_name* – это строка, задающая имя подраздела, с которым связано значение.

*type* – это целое число, задающее тип данных. Это должна быть одна из следующих констант, определённых в данном модуле:

| Константа | Значение |
| --- | --- |
| `REG_BINARY` | Двоичные данные в любом виде. |
| `REG_DWORD` | 32-битное число. |
| `REG_DWORD_LITTLE_ENDIAN` | 32-разрядное число в формате little-endian. |
| `REG_DWORD_BIG_ENDIAN` | 32-разрядное число в формате big-endian. |
| `REG_EXPAND_SZ` | Строка, завершающаяся нулевым символом, содержащая ссылки на переменные окружения (`%PATH%`). |
| `REG_LINK` | Символическая ссылка в Юникоде. |
| `REG_MULTI_SZ` | Последовательность строк, завершающихся нулевым символом, заканчивающаяся двумя нулевыми символами. (Python обрабатывает это завершение автоматически.) |
| `REG_NONE` | Неопределённый тип значения. |
| `REG_RESOURCE_LIST` | Список ресурсов драйвера устройства. |
| `REG_SZ` | Нуль-терминированная строка. |

*reserved* может быть чем угодно – в API всегда передаётся ноль.

*value* – это строка, задающая новое значение.

Этот метод также может задавать дополнительные данные и информацию о типе для указанного раздела. Раздел, указанный параметром key, должен быть открыт с правом доступа `KEY_SET_VALUE`.

Чтобы открыть раздел, используйте методы `CreateKeyEx()` или [`OpenKey()`](https://python-all.ru/3.0/library/winreg.html#winreg.OpenKey).

Длина значений ограничена доступной памятью. Длинные значения (более 2048 байт) следует хранить в виде файлов, имена которых сохраняются в конфигурационном реестре. Это помогает реестру работать эффективно.

## Объекты дескрипторов реестра

Этот объект оборачивает объект Windows HKEY, автоматически закрывая его при уничтожении объекта. Чтобы гарантированно освободить ресурсы, можно вызвать либо метод `Close()` самого объекта, либо функцию [`CloseKey()`](https://python-all.ru/3.0/library/winreg.html#winreg.CloseKey).

Все функции реестра в этом модуле возвращают один из таких объектов.

Все функции реестра в этом модуле, принимающие объект дескриптора, также принимают целое число, однако рекомендуется использовать объект дескриптора.

Объекты дескриптора поддерживают семантику [`__bool__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__bool__) – поэтому

```python
if handle:
    print("Yes")
```

будет выведено `Yes`, если дескриптор в текущий момент действителен (не был закрыт или отсоединён).

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

Объекты дескриптора можно преобразовать в целое число (например, с помощью встроенной функции [`int()`](https://python-all.ru/3.0/library/functions.html#int)), в этом случае возвращается базовое значение дескриптора Windows. Также можно использовать метод `Detach()`, чтобы получить целочисленный дескриптор и отсоединить дескриптор Windows от объекта дескриптора.

#### `[winreg.PyHKEY.Close]PyHKEY.Close()`

Закрывает соответствующий дескриптор Windows.

Если дескриптор уже закрыт, ошибка не возникает.

#### `[winreg.PyHKEY.Detach]PyHKEY.Detach()`

Отсоединяет дескриптор Windows от объекта дескриптора.

Результат – целое число, содержащее значение дескриптора до его отсоединения. Если дескриптор уже отсоединён или закрыт, возвращается ноль.

После вызова этой функции дескриптор фактически становится недействительным, но дескриптор не закрывается. Эту функцию следует вызывать, когда требуется, чтобы базовый дескриптор Win32 существовал дольше, чем время жизни объекта дескриптора.

#### `[winreg.PyHKEY.__enter__]PyHKEY.__enter__()`

#### `PyHKEY.__exit__(*exc_info)`

Объект HKEY реализует [`__enter__()`](https://python-all.ru/3.0/library/winreg.html#winreg.PyHKEY.__enter__) и [`__exit__()`](https://python-all.ru/3.0/library/winreg.html#winreg.PyHKEY.__exit__) и, таким образом, поддерживает протокол контекстного менеджера для оператора [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with):

```python
with OpenKey(HKEY_LOCAL_MACHINE, "foo") as key:
    # ... работа с разделом ...
```

автоматически закроет *key*, когда управление покинет блок [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with).
