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)