用户注册表html代码:读取注册表的 Python代码

from _winreg import *
"""print r"*** Reading from SOFTWARE\Microsoft\Windows\CurrentVersion\Run ***" """
aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE)
aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
for i in range(1024):
    try:
        asubkey=EnumKey(aKey,i)
        val=QueryValueEx(asubkey, "DisplayName")
        print val
    except EnvironmentError:
        break

任何人都可以纠正错误...我只想在 HKLM\ SOFTWARE\ Microsoft\ Windows\ CurrentVersion\ Uninstall 键的子键中显示“DisplayName”这是我得到的错误..

Traceback (most recent call last):
  File "C:/Python25/ReadRegistry", line 10, in <module>
    val=QueryValueEx(asubkey, "DisplayName")
TypeError: The object is not a PyHKEY object
35

DocumentationEnumKey返回带有键名的字符串。你必须用_winreg.OpenKey函数显式打开它。我已经修复了你的代码片段:

from _winreg import *
aKey = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
aReg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
print(r"*** Reading from %s ***" % aKey)
aKey = OpenKey(aReg, aKey)
for i in range(1024):
    try:
        asubkey_name = EnumKey(aKey, i)
        asubkey = OpenKey(aKey, asubkey_name)
        val = QueryValueEx(asubkey, "DisplayName")
        print(val)
    except EnvironmentError:
        break

请注意,并非每个键都有“DisplayName”值可用。

23

x64 上的 x86 呢?Use 64-bit Specific Types

如果“卸载”中有超过 1024 个子密钥怎么办?Use _winreg.QueryInfoKey(key)

Python 2:
import errno, os, _winreg
proc_arch = os.environ['PROCESSOR_ARCHITECTURE'].lower()
proc_arch64 = os.environ['PROCESSOR_ARCHITEW6432'].lower()
if proc_arch == 'x86' and not proc_arch64:
    arch_keys = {0}
elif proc_arch == 'x86' or proc_arch == 'amd64':
    arch_keys = {_winreg.KEY_WOW64_32KEY, _winreg.KEY_WOW64_64KEY}
else:
    raise Exception("Unhandled arch: %s" % proc_arch)
for arch_key in arch_keys:
    key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", 0, _winreg.KEY_READ | arch_key)
    for i in xrange(0, _winreg.QueryInfoKey(key)[0]):
        skey_name = _winreg.EnumKey(key, i)
        skey = _winreg.OpenKey(key, skey_name)
        try:
            print _winreg.QueryValueEx(skey, 'DisplayName')[0]
        except OSError as e:
            if e.errno == errno.ENOENT:
                # DisplayName doesn't exist in this skey
                pass
        finally:
            skey.Close()
Python 3:
import errno, os, winreg
proc_arch = os.environ['PROCESSOR_ARCHITECTURE'].lower()
proc_arch64 = os.environ['PROCESSOR_ARCHITEW6432'].lower()
if proc_arch == 'x86' and not proc_arch64:
    arch_keys = {0}
elif proc_arch == 'x86' or proc_arch == 'amd64':
    arch_keys = {winreg.KEY_WOW64_32KEY, winreg.KEY_WOW64_64KEY}
else:
    raise Exception("Unhandled arch: %s" % proc_arch)
for arch_key in arch_keys:
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", 0, winreg.KEY_READ | arch_key)
    for i in range(0, winreg.QueryInfoKey(key)[0]):
        skey_name = winreg.EnumKey(key, i)
        skey = winreg.OpenKey(key, skey_name)
        try:
            print(winreg.QueryValueEx(skey, 'DisplayName')[0])
        except OSError as e:
            if e.errno == errno.ENOENT:
                # DisplayName doesn't exist in this skey
                pass
        finally:
            skey.Close()
5

正如_winreg.QueryValueEx文档中所说,您需要传递一个已经打开的密钥。EnumKey返回一个字符串,而不是一个打开的密钥。

aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE)
aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
for i in range(1024):
    try:
        keyname = EnumKey(aKey, i)
        asubkey = OpenKey(aKey, keyname)
        val = QueryValueEx(asubkey, "DisplayName")
        print val
    except WindowsError:
        break
5

我简化了_winreg查询给定注册表项的嵌套值的功能。

例如,这是如何直接查询您询问的注册表项:

key = r'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
for sub_key in get_sub_keys(key):
    path = join(key, sub_key)
    value = get_values(path, ['DisplayName', 'DisplayVersion', 'InstallDate'])
    if value:
        print value

输出

{'DisplayVersion': u'347.25', 'DisplayName': u'NVIDIA Control Panel 347.25', 'InstallDate': u'20150125'}
{'DisplayVersion': u'347.25', 'DisplayName': u'NVIDIA Graphics Driver 347.25', 'InstallDate': u'20150125'}
{'DisplayVersion': u'2.2.2', 'DisplayName': u'NVIDIA GeForce Experience 2.2.2', 'InstallDate': u'20150212'}
...

也添加这些实用程序函数:

from _winreg import *
import os
roots_hives = {
    "HKEY_CLASSES_ROOT": HKEY_CLASSES_ROOT,
    "HKEY_CURRENT_USER": HKEY_CURRENT_USER,
    "HKEY_LOCAL_MACHINE": HKEY_LOCAL_MACHINE,
    "HKEY_USERS": HKEY_USERS,
    "HKEY_PERFORMANCE_DATA": HKEY_PERFORMANCE_DATA,
    "HKEY_CURRENT_CONFIG": HKEY_CURRENT_CONFIG,
    "HKEY_DYN_DATA": HKEY_DYN_DATA
}
def p_key(key):
    key = key.upper()
    parts = key.split('\\')
    root_hive_name = parts[0]
    root_hive = roots_hives.get(root_hive_name)
    partial_key = '\\'.join(parts[1:])
    if not root_hive:
        raise Exception('root hive "{}" was not found'.format(root_hive_name))
    return partial_key, root_hive
def get_sub_keys(key):
    partial_key, root_hive = p_key(key)
    with ConnectRegistry(None, root_hive) as reg:
        with OpenKey(reg, partial_key) as key_object:
            sub_keys_count, values_count, last_modified = QueryInfoKey(key_object)
            try:
                for i in range(sub_keys_count):
                    sub_key_name = EnumKey(key_object, i)
                    yield sub_key_name
            except WindowsError:
                pass
def get_values(key, fields):
    partial_key, root_hive = p_key(key)
    with ConnectRegistry(None, root_hive) as reg:
        with OpenKey(reg, partial_key) as key_object:
            data = {}
            for field in fields:
                try:
                    value, type = QueryValueEx(key_object, field)
                    data[field] = value
                except WindowsError:
                    pass
            return data
def get_value(key, field):
    values = get_values(key, [field])
    return values.get(field)
def join(path, *paths):
    path = path.strip('/\\')
    paths = map(lambda x: x.strip('/\\'), paths)
    paths = list(paths)
    result = os.path.join(path, *paths)
    result = result.replace('/', '\\')
    return result

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(10)
几代cpu支持pcie4.0:PCIe延迟卡到 cpu
上一篇
Python人脸识别源码:如何在python中进行背景人脸识别
下一篇

相关推荐

  • python中bs4:使用Beautiful Soup解析HTML文档

    Beautiful Soup(简称BS4)是一个Python库,它可以解析HTML和XML文档,从而使用它们提取数据。它使用一种名为“树形遍历”的方法来解析文档,这意味着它会深入到文档中每个节点,以便查找所需的信息。…

    2023-09-24 13:11:53
    0 47 38
  • python写html文件:This is a Title

    示例示例Python可以使用模板引擎,如Jinja2,来编写HTML文件。下面是一个简单的示例:…

    2023-02-21 12:05:23
    0 41 27
  • Html简单网页模板:Python中的简单HTML模板

    关于Html简单网页模板的问题,在simple html template中经常遇到,我想用 Python 中的数据填充一个 HTML 模板。虽然我不知道任何 HTML,但我的一个同事会准备 HTML 模板,而我提供数据。但是,他对 Python 知之甚少。…

    2024-05-28 03:04:46
    0 55 72
  • python精度:如何利用Python来提高精度

    Python精度是指Python程序在数值计算时所能提供的最大精度。它取决于Python程序使用的数字类型,以及Python解释器的精度。…

    2023-04-01 04:27:43
    0 20 78
  • python界面开发构建一个简单、可靠的用户界面

    Python界面开发是指使用Python语言来创建图形用户界面(GUI)的过程。它可以帮助你创建可视化的应用程序,使用户能够与你的程序交互。…

    2023-03-18 10:39:36
    0 34 28
  • python 软件测试深入了解如何确保质量

    Python软件测试是一种使用Python编写的自动化测试,它可以帮助开发人员进行软件测试。Python软件测试主要涉及到三个方面:单元测试、集成测试和系统测试。…

    2023-08-14 11:34:51
    0 95 26
  • pythonlist切片:利用Python列表切片获取最大价值

    示例示例Python列表切片是指从列表中提取特定范围的元素,而不需要遍历整个列表。 列表切片使用方括号[]和冒号:来表示,其形式如下:list[start:end:step]…

    2023-07-31 01:45:29
    0 90 49
  • python imread函数一步搞定!

    Python imread函数是用于从图像文件读取图像数据的函数,它是由Scipy库提供的。它可以从多种格式的图像文件中读取图像数据,包括JPEG、PNG、TIFF、GIF等。…

    2023-05-26 15:06:44
    0 90 56

发表评论

登录 后才能评论

评论列表(66条)