2014-11-05 5 views
0

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

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) 
+0

ну, я импортирую winreg. Я не понимаю, почему мне нужно сделать winreg.OpenKey – jerryh91

ответ

2

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

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

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

from winreg import CreateKey, OpenKey, ConnectRegistry, etc 

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

+0

Я попробовал из winreg import ..., однако компилятор говорит, что «имя winreg не определено» – jerryh91

+0

Oh Nevermind, я уже импортирую эти функции в winreg. Это относится к строке, в которой я снова использую winreg.Method – jerryh91

1

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

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

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

If no other name is specified, and the module being imported is a top level module, the module’s name is bound in the local namespace as a reference to the imported module

Как вы можете видеть, импортировать модуль только делает модуль доступным для использования. Все его содержимое (globals/functions/classes/etc.) Все еще сохраняется внутри пространства имен модулей.


В качестве альтернативы, вы можете импортировать имена, которые вы планируете использовать непосредственно:

from winreg import CreateKey, OpenKey, SetValueEx 

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