对windows注册表的基于pythonic对象的访问。

regobj的Python项目详细描述


regobj:对Windows注册表的基于Pythonic对象的访问

此模块为标准的winreg模块提供了一个薄包装, 允许对Windows注册表进行更简单和更具pythonic性的访问

对注册表的所有访问都是通过键对象完成的,这(令人惊讶!) 表示特定的注册表项。首先,存在预先存在的密钥。 为hkey根键定义的对象,使用长名称和短名称:

>>> HKEY_CURRENT_USER
<regobj Key 'HKEY_CURRENT_USER'>
>>> HKLM
<regobj Key 'HKEY_LOCAL_MACHINE'>

然后遍历和创建子键就像普通的python一样简单 属性访问:

>>> HKCU.Software.Microsoft.Windows
<regobj Key 'HKEY_CURRENT_USER\Software\Microsoft\Windows'>
>>> HKCU.Software.MyTests
Traceback (most recent call last):
    ...
AttributeError: subkey 'MyTests' does not exist
>>> HKCU.Software.MyTests = Key
>>> HKCU.Software.MyTests
<regobj Key 'HKEY_CURRENT_USER\Software\MyTests'>
>>> del HKCU.Software.MyTests

当然,对于没有像python标识符那样命名的键, 也有方法可以完成同样的事情。帮助减少 视觉混乱,调用键对象是属性查找的简写:

>>> HKCU.Software.set_subkey("my-funny-key",Key)
>>> HKCU.Software.get_subkey("my-funny-key").SubKey = Key
>>> HKCU("Software\my-funny-key\SubKey")
<regobj Key 'HKEY_CURRENT_USER\Software\my-funny-key\SubKey'>
>>> HKCU.Software.del_subkey("my-funny-key")

可以使用标准 项访问语法。返回的对象将是该值的实例 类,具有“name”、“type”和“data”属性:

>>> HKCU.Software.Microsoft.Clock["iFormat"]
<regobj Value (iFormat,1,REG_SZ)>
>>> HKCU.Software.Microsoft.Clock["iFormat"].name
'iFormat'
>>> print(HKCU.Software.Microsoft.Clock["iFormat"].data)
1
>>> print(type(HKCU.Software.Microsoft.Clock["iFormat"].data) is type(b'1'.decode('utf8')))
True
>>> HKCU.Software.Microsoft.Clock["iFormat"].type
1
>>> HKCU.Software.Microsoft.Clock["notavalue"]
Traceback (most recent call last):
    ...
KeyError: "no such value: 'notavalue'"

对键进行迭代将生成所有包含的值,然后 所有包含的子键。还有一些方法可以单独迭代 除了值,还有子键:

>>> winK = HKCU.Software.Microsoft.Windows
>>> winK["testvalue"] = 42
>>> for obj in winK:
...   print(obj)
<regobj Value (testvalue,42,REG_DWORD)>
<regobj Key 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion'>
<regobj Key 'HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell'>
<regobj Key 'HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam'>
>>> [k.name for k in winK.subkeys()]
['CurrentVersion', 'Shell', 'ShellNoRoam']
>>> [v.data for v in winK.values()]
[42]
>>> del winK["testvalue"]

这些迭代器还提供了__ 和“len”方法,因此它们可以使用如下:

>>> "Shell" in HKCU.Software.Microsoft.Windows
True
>>> "Shell" in HKCU.Software.Microsoft.Windows.subkeys()
True
>>> "Shell" in HKCU.Software.Microsoft.Windows.values()
False
>>> len(HKCU.Software.Microsoft.Windows)
3
>>> len(HKCU.Software.Microsoft.Windows.values())
0

最后,有强大的支持来指定键和值结构 在创造的时候。最简单的例子已经被证明了 将子项设置为key类或none将在没有任何数据的情况下创建它:

>>> HKCU.Software.MyTests = None
>>> len(HKCU.Software.MyTests)
0

如果子密钥被分配了一个现有的密钥对象,则该密钥的数据是 复制到子项中:

>>> HKCU.Software.MyTests = HKCU.Software.Microsoft.Windows
>>> len(HKCU.Software.MyTests)
3
>>> [k.name for k in HKCU.Software.MyTests]
['CurrentVersion', 'Shell', 'ShellNoRoam']
>>> del HKCU.Software.MyTests

如果为子键分配了字典,则该字典的结构为 复制到子项中标量值成为键值,而嵌套 字典创建子键:

>>> HKCU.Software.MyTests = {"val1":7, "stuff":{"a":1,"c":2,"e":3}}
>>> len(HKCU.Software.MyTests)
2
>>> [v.name for v in HKCU.Software.MyTests.values()]
['val1']
>>> [k.name for k in HKCU.Software.MyTests.subkeys()]
['stuff']
>>> len(HKCU.Software.MyTests.stuff)
3
>>> del HKCU.Software.MyTests

分配给子项的任何其他值都将成为 该键(即名为“”的值):

>>> HKCU.Software.MyTests = "dead parrot"
>>> print(HKCU.Software.MyTests[""].data)
dead parrot
>>> print(type(HKCU.Software.MyTests[""].data) is type(b'dead parrot'.decode('utf8')))
True
>>> del HKCU.Software.MyTests

就这样-享受吧!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么只为字符数组重载println方法,而不为字符串、整数等其他数组重载?   java将快速线程返回到池中,而不是等待慢速线程   创建jar文件时java SwingWorker不工作   java如何将依赖注入RabbitListener   java如何在gradle任务中通过scp复制目录?   java在MySql数据库中创建表时,遇到NullPointerException   java HTTP Status 500 Servlet执行引发异常   在JAVA中对arraylist使用继承时出错   java PowerMockito未完成存根异常   如果没有错误/警告增加到某个极限,java是否停止在eclipse中构建项目或使用maven?   java Robolectric如何测试DateFormat。getBestDateTimePattern()   google云平台GCP数据存储Java API,构建一个空值实体   VerifyListener和FocusListener之间的java冲突   安卓是否可以在Java中的另一个方法内部强制调用一个方法?   JavaWindows7、JDK1.8、SpringBoot应用程序JAR在方法安全性方面占用了大量时间。getProviders()返回   Bean提供程序的java错误消息   java Slick动画每帧必须有一个持续时间   java无法在Trie中设置isLeaf标志   java为什么JVM不能创建包含main方法的类的对象,以便从该类访问main方法,如果它具有该类的名称?   java Apache Camel+CXF端点身份验证