NameError:未使用winreg定义名称“OpenKey”

时间:2014-11-05 16:44:14

标签: python regedit winreg

在Python中,我试图打开一个regedit Key来为它添加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)

3 个答案:

答案 0 :(得分:2)

当您使用import winreg导入它时,您需要使用winreg.xxxxxx引用该名称空间中的所有方法。

因此,您需要使用winreg.OpenKeywinreg.ConnectRegistry

或者,您可以

from winreg import CreateKey, OpenKey, ConnectRegistry, etc

这样您就可以使用CreateKey等,而无需winreg前缀。

答案 1 :(得分:1)

OpenKey函数位于内部 winreg模块中。这意味着,您需要在其前面添加winreg.才能访问它:

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

同样适用于ConnectRegistrySetValueEx以及您在模块中使用的任何其他名称。您可以在docs

中了解此行为
  

如果未指定其他名称,并且正在导入的模块是顶级模块,则模块的名称将绑定在本地名称空间中,作为对导入模块的引用

如您所见,导入模块仅使模块可供使用。它的所有内容(全局/函数/类/等)仍保留在模块的命名空间内。


或者,您可以导入您计划直接使用的名称:

from winreg import CreateKey, OpenKey, SetValueEx

然后,您不需要在winreg.前添加前缀。但是我只建议你在使用几个名字时这样做。导入许多这样的名称会导致丑陋的代码和混乱的全局命名空间。

答案 2 :(得分:0)

添加脚本以使用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)