在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)
答案 0 :(得分:2)
当您使用import winreg
导入它时,您需要使用winreg.xxxxxx
引用该名称空间中的所有方法。
因此,您需要使用winreg.OpenKey
和winreg.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)
# ^^^^^^^
同样适用于ConnectRegistry
,SetValueEx
以及您在模块中使用的任何其他名称。您可以在docs:
如果未指定其他名称,并且正在导入的模块是顶级模块,则模块的名称将绑定在本地名称空间中,作为对导入模块的引用
如您所见,导入模块仅使模块可供使用。它的所有内容(全局/函数/类/等)仍保留在模块的命名空间内。
或者,您可以导入您计划直接使用的名称:
from winreg import CreateKey, OpenKey, SetValueEx
然后,您不需要在winreg.
前添加前缀。但是我只建议你在使用几个名字时这样做。导入许多这样的名称会导致丑陋的代码和混乱的全局命名空间。
答案 2 :(得分:0)
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)