NameError: имя 'OpenKey' не определено с помощью winreg

В Python я пытаюсь открыть ключ regedit, чтобы добавить к нему значение String. Тем не менее, это как-то не признает OpenKey() или же ConnectRegistry метод.

import winreg
import sys
#Create 2 keys with unique GUIDs as Names

KeyName1 = "AppEvents\{Key1}"
KeyName2 = "AppEvents\{Key2}"
KeyName1_Path = "C:\Install\Monitor\Path.asmtx"


winreg.CreateKey(winreg.HKEY_CURRENT_USER, KeyName1)
winreg.CreateKey(winreg.HKEY_CURRENT_USER,  KeyName2)

#Add String as Path
# aReg = ConnectRegistry(None,HKEY_CURRENT_USER) #NameError: name 'ConnectRegistry' is not defined

keyVal=OpenKey(winreg.HKEY_CURRENT_USER,r"AppEvents\{Key2}", 0,KEY_WRITE) ameError: name 'OpenKey' is not defined


SetValueEx(keyVal,"Path",0,REG_SZ, KeyName1_Path)

2 ответа

Решение

Как вы импортировали его с import winreg вам нужно обратиться ко всем методам в этом пространстве имен, используя winreg.xxxxxx,

Таким образом, вы должны использовать winreg.OpenKey а также winreg.ConnectRegistry,

В качестве альтернативы, вы могли бы сделать

from winreg import CreateKey, OpenKey, ConnectRegistry, etc

Это позволит вам использовать CreateKeyи т. д. без необходимости winreg префикс.

OpenKey функция находится внутри winreg модуль. Это означает, что вы должны поставить перед ним префикс winreg. чтобы получить к нему доступ:

keyVal = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r"AppEvents\{Key2}", 0,KEY_WRITE)
#        ^^^^^^^

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

Если другое имя не указано, а импортируемый модуль является модулем верхнего уровня, имя модуля связывается в локальном пространстве имен как ссылка на импортируемый модуль.

Как видите, импорт модуля только делает модуль доступным для использования. Все его содержимое (глобальные / функциональные / классы / и т. Д.) Все еще сохраняется в пространстве имен модуля.


Кроме того, вы можете импортировать имена, которые вы планируете использовать напрямую:

from winreg import CreateKey, OpenKey, SetValueEx

Тогда вам не нужно ставить перед ними префикс winreg., Но я бы рекомендовал делать это только тогда, когда вы используете только несколько имен. Такой импорт десятков имен приводит к уродливому коду и хаотичному глобальному пространству имен.

Добавить скрипт для загрузки с windows

import os,sys
import winreg as reg
def addStartup():  
    fp = os.path.dirname(os.path.realpath(__file__))
    file_name = sys.argv[0].split('\\')[-1]
    new_file_path = fp + '\\' + file_name
    keyVal = r'Software\Microsoft\Windows\CurrentVersion\Run'
    key2change = reg.OpenKey(reg.HKEY_CURRENT_USER, keyVal, 0, reg.KEY_ALL_ACCESS)
    reg.SetValueEx(key2change, 'CustomProgramName', 0, reg.REG_SZ,new_file_path)
Другие вопросы по тегам