Документация Python неофициальный перевод
Содержание страницы

34.3. _winreg – доступ к реестру Windows_winreg – Windows registry access

Платформы: Windows

Примечание

Модуль _winreg был переименован в winreg в Python 3.0. Инструмент 2to3 автоматически адаптирует импорты при преобразовании исходных кодов в версию 3.0.

Новое в версии 2.0.

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

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

_winreg.CloseKey(hkey)

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

Примечание

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

_winreg.ConnectRegistry(computer_name, key)

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

computer_name – имя удаленного компьютера, вида r"\\computername". Если указано None, используется локальный компьютер.

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

Возвращаемое значение – дескриптор открытого ключа. Если функция завершается ошибкой, возбуждается исключение WindowsError.

_winreg.CreateKey(key, sub_key)

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

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

sub_key – это строка, задающая имя ключа, который открывает или создает этот метод.

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

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

Возвращаемое значение – дескриптор открытого ключа. Если функция завершается ошибкой, возбуждается исключение WindowsError.

_winreg.DeleteKey(key, sub_key)

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

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

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

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

В случае успеха метода удаляется весь ключ, включая все его значения. Если метод завершается с ошибкой, возбуждается исключение WindowsError.

_winreg.DeleteValue(key, value)

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

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

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

_winreg.EnumKey(key, index)

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

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

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

Функция при каждом вызове получает имя одного подключа. Обычно её вызывают многократно, пока не будет возбуждено исключение WindowsError, указывающее, что данные закончились.

_winreg.EnumValue(key, index)

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

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

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

Функция при каждом вызове получает имя одного подключа. Обычно её вызывают многократно, пока не будет возбуждено исключение WindowsError, указывающее, что больше нет значений.

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

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

Заменяет плейсхолдеры переменных окружения %NAME% в строках Unicode, например REG_EXPAND_SZ:

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

Новое в версии 2.6.

_winreg.FlushKey(key)

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

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

Необязательно вызывать FlushKey() для изменения ключа. Изменения в реестре сбрасываются на диск реестром с помощью его отложенного сброса (lazy flusher). Изменения в реестре также сбрасываются на диск при завершении работы системы. В отличие от CloseKey(), метод FlushKey() возвращает управление только после того, как все данные будут записаны в реестр. Приложение должно вызывать FlushKey() только если ему нужна абсолютная уверенность, что изменения в реестре записаны на диск.

Примечание

Если нет уверенности, требуется ли вызов FlushKey(), то, скорее всего, он не требуется.

_winreg.LoadKey(key, sub_key, file_name)

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

key is a handle returned by ConnectRegistry() or one of the constants HKEY_USERS or HKEY_LOCAL_MACHINE.

sub_key – это строка, идентифицирующая загружаемый подраздел.

file_name – это имя файла, из которого загружаются данные реестра. Этот файл должен быть создан функцией SaveKey(). В файловой системе FAT (file allocation table) имя файла не может содержать расширение.

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

Если key – это дескриптор, возвращаемый ConnectRegistry(), то путь, указанный в file_name, является относительным для удалённого компьютера.

_winreg.OpenKey(key, sub_key[, res[, sam]])

Открывает указанный раздел и возвращает объект-дескриптор.

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

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

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

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

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

Если функция завершается ошибкой, возбуждается WindowsError.

_winreg.OpenKeyEx()
Функциональность OpenKeyEx() реализована через OpenKey(), с использованием аргументов по умолчанию.
_winreg.QueryInfoKey(key)

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

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

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

Индекс Значение
0 Целое число, указывающее количество подразделов, которые есть у этого раздела.
1 Целое число, указывающее количество значений, которые есть у этого раздела.
2 Длинное целое число, показывающее, когда ключ был последний раз изменён (если доступно), в сотнях наносекунд с 1 января 1600 года.
_winreg.QueryValue(key, sub_key)

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

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

sub_key – это строка, содержащая имя подключа, с которым связано значение. Если этот параметр равен None или пуст, функция извлекает значение, установленное методом SetValue() для ключа, заданного key.

Значения в реестре имеют компоненты: имя, тип и данные. Этот метод извлекает данные для первого значения ключа, имеющего имя NULL. Однако базовый вызов API не возвращает тип, поэтому всегда следует использовать QueryValueEx(), если это возможно.

_winreg.QueryValueEx(key, value_name)

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

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

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

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

Индекс Значение
0 Значение элемента реестра.
1 Целое число, задающее тип реестра для этого значения (см. таблицу в документации для SetValueEx())
_winreg.SaveKey(key, file_name)

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

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

file_name – это имя файла, в который будут сохранены данные реестра. Этот файл не должен существовать. Если имя файла содержит расширение, его нельзя использовать в файловых системах FAT (file allocation table) с помощью метода LoadKey().

Если key представляет ключ на удалённом компьютере, путь, описанный в file_name, является относительным для этого удалённого компьютера. Вызывающий этот метод должен обладать привилегией безопасности SeBackupPrivilege. Обратите внимание, что привилегии отличаются от разрешений – см. документацию Conflicts Between User Rights and Permissions для получения дополнительных сведений.

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

_winreg.SetValue(key, sub_key, type, value)

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

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

sub_key – строка, задающая имя подраздела, с которым связывается значение.

type – целое число, указывающее тип данных. В настоящее время это должно быть REG_SZ, то есть поддерживаются только строки. Используйте функцию SetValueEx() для поддержки других типов данных.

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

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

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

Ключ, заданный параметром key, должен быть открыт с доступом KEY_SET_VALUE.

_winreg.SetValueEx(key, value_name, reserved, type, value)

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

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

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

type – это целое число, задающее тип данных. Смотрите Value Types для получения списка доступных типов.

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

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

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

Чтобы открыть ключ, используйте методы CreateKey() или OpenKey().

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

_winreg.DisableReflectionKey(key)

Отключает отражение реестра для 32-разрядных процессов, работающих в 64-разрядной операционной системе.

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

Обычно вызывает NotImplemented при выполнении в 32-разрядной операционной системе.

Если ключ отсутствует в списке отражения, функция выполняется успешно, но не имеет эффекта. Отключение отражения для ключа не влияет на отражение любых подключей.

_winreg.EnableReflectionKey(key)

Восстанавливает отражение реестра для указанного отключённого ключа.

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

Обычно вызывает NotImplemented при выполнении в 32-разрядной операционной системе.

Восстановление отражения для ключа не влияет на отражение каких-либо подключачей.

_winreg.QueryReflectionKey(key)

Определяет состояние отражения для указанного ключа.

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

Возвращает True, если отражение отключено.

Обычно вызывает NotImplemented при выполнении в 32-разрядной операционной системе.

34.3.1. КонстантыConstants

Следующие константы определены для использования во многих функциях _winreg.

34.3.1.1. Константы HKEY_*HKEY_* Constants

_winreg.HKEY_CLASSES_ROOT
Записи реестра, подчинённые этому ключу, определяют типы (или классы) документов и свойства, связанные с этими типами. Оболочка и COM-приложения используют информацию, хранящуюся в этом ключе.
_winreg.HKEY_CURRENT_USER
Записи реестра, подчинённые этому ключу, определяют настройки текущего пользователя. Эти настройки включают параметры переменных среды, данные о группах программ, цветах, принтерах, сетевых подключениях и настройках приложений.
_winreg.HKEY_LOCAL_MACHINE
Записи реестра, подчинённые этому ключу, определяют физическое состояние компьютера, включая данные о типе шины, системной памяти и установленном оборудовании и программном обеспечении.
_winreg.HKEY_USERS
Записи реестра, подчинённые этому ключу, определяют конфигурацию пользователя по умолчанию для новых пользователей локального компьютера и конфигурацию для текущего пользователя.
_winreg.HKEY_PERFORMANCE_DATA
Записи реестра, подчинённые этому ключу, позволяют получить доступ к данным производительности. На самом деле эти данные не хранятся в реестре; функции реестра заставляют систему собирать их из источника.
_winreg.HKEY_CURRENT_CONFIG
Содержит информацию о текущем профиле оборудования локальной компьютерной системы.
_winreg.HKEY_DYN_DATA
Этот ключ не используется в версиях Windows после 98.

34.3.1.2. Права доступаAccess Rights

За дополнительными сведениями см. Безопасность и доступ к ключам реестра.

_winreg.KEY_ALL_ACCESS
Объединяет права доступа STANDARD_RIGHTS_REQUIRED, KEY_QUERY_VALUE, KEY_SET_VALUE, KEY_CREATE_SUB_KEY, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY и KEY_CREATE_LINK.
_winreg.KEY_WRITE
Объединяет права доступа STANDARD_RIGHTS_WRITE, KEY_SET_VALUE и KEY_CREATE_SUB_KEY.
_winreg.KEY_READ
Объединяет значения STANDARD_RIGHTS_READ, KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS и KEY_NOTIFY.
_winreg.KEY_EXECUTE
Эквивалентно KEY_READ.
_winreg.KEY_QUERY_VALUE
Требуется для запроса значений ключа реестра.
_winreg.KEY_SET_VALUE
Требуется для создания, удаления или установки значения реестра.
_winreg.KEY_CREATE_SUB_KEY
Требуется для создания вложенного ключа реестра.
_winreg.KEY_ENUMERATE_SUB_KEYS
Требуется для перечисления вложенных ключей реестра.
_winreg.KEY_NOTIFY
Требуется для запроса уведомлений об изменениях для ключа реестра или для его вложенных ключей.
Зарезервировано для использования системой.

34.3.1.2.1. Специфика 64-разрядной версии64-bit Specific

Дополнительные сведения см. в Accesing an Alternate Registry View.

_winreg.KEY_WOW64_64KEY
Указывает, что приложение в 64-разрядной Windows должно работать с 64-разрядным представлением реестра.
_winreg.KEY_WOW64_32KEY
Указывает, что приложение в 64-разрядной Windows должно работать с 32-разрядным представлением реестра.

34.3.1.3. Типы значенийValue Types

Для получения дополнительной информации см. Типы значений реестра.

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

34.3.2. Объекты дескрипторов реестраRegistry Handle Objects

Этот объект оборачивает объект Windows HKEY, автоматически закрывая его при уничтожении объекта. Чтобы гарантировать очистку, можно вызвать либо метод Close() у объекта, либо функцию CloseKey().

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

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

Объекты дескрипторов предоставляют семантику для __nonzero__() – а именно:

if handle:
    print "Yes"

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

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

Объекты дескрипторов можно преобразовать в целое число (например, с помощью встроенной функции int()), в этом случае возвращается значение базового дескриптора Windows. Также можно использовать метод Detach(), чтобы вернуть целочисленный дескриптор и отсоединить дескриптор Windows от объекта дескриптора.

PyHKEY.Close()

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

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

PyHKEY.Detach()

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

Результатом является целое число (или длинное целое в 64-разрядной Windows), которое содержит значение дескриптора перед его отсоединением. Если дескриптор уже отсоединён или закрыт, этот вызов возвращает ноль.

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

PyHKEY.__enter__()
PyHKEY.__exit__(*exc_info)

Объект HKEY реализует __enter__() и __exit__(), и таким образом поддерживает протокол контекста для оператора with:

with OpenKey(HKEY_LOCAL_MACHINE, "foo") as key:
    ...  # работа с ключом

автоматически закроет key, когда управление покинет блок with.

Новое в версии 2.6.