0

在 Python 中,我试图打开一个 regedit Key 来向它添加字符串值。但是,它以某种方式无法识别OpenKey()orConnectRegistry方法。

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)
4

3 回答 3

2

当您使用它导入它时,import winreg您需要使用winreg.xxxxxx.

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

或者,你可以做

from winreg import CreateKey, OpenKey, ConnectRegistry, etc

这将允许您CreateKey在不需要winreg前缀的情况下使用等。

于 2014-11-05T16:46:37.197 回答
1

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.. 但我只建议在您只使用几个名称时这样做。像这样导入数十个名称会导致代码丑陋和全局命名空间混乱。

于 2014-11-05T16:46:16.660 回答
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)
于 2020-03-23T06:42:00.363 回答