操作Windows注册表的简单的Python程序制作教程


Posted in Python onApril 07, 2015

通过Python操作注册表有两种方式,第一种是通过Python的内置模块 _winreg;另一种方式就是Win32 Extension For Python 的win32api模块,但是需要进行额外的安装。这里主要给出一些_winreg和win32api的Demo代码。

 

1、 _winrg

可以参考官方的参考文档:

http://docs.python.org/library/_winreg.html

http://www.python.org/doc/2.6.2/library/_winreg.html

 

1.1 读取 
 

import _winreg
 
key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER,r"Software\Microsoft\Windows\CurrentVersion\Explorer")
 
 #获取该键的所有键值,因为没有方法可以获取键值的个数,所以只能用这种方法进行遍历
 try:
  i = 0
while1:
#EnumValue方法用来枚举键值,EnumKey用来枚举子键
     name, value, type = _winreg.EnumValue(key, i)
print repr(name),
    i +=1
 except WindowsError:
print
 
 #如果知道键的名称,也可以直接取值
 value, type = _winreg.QueryValueEx(key, "EnableAutoTray")

1.2 创建修改
 

import _winreg
 
key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER,r"Software\Microsoft\Windows\CurrentVersion\Explorer")
 
#删除键
_winreg.DeleteKey(key, "Advanced")
 
#删除键值
_winreg.DeleteValue(key, "IconUnderline")
 
#创建新的键
newKey = _winreg.CreateKey(key,"MyNewkey")
 
#给新创建的键添加键值
_winreg.SetValue(newKey,"ValueName",0,"ValueContent")

1.3 访问远程注册表
 
1 #第二参数必须是HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE等预先定义好的值,拿到返回的key后就可以进行操作了
2 key = _winreg.ConnectRegisty("IP地址或者机器名",_winreg.HKEY_CURRENT_USER)

2、 win32api

win32api 和 _winreg 的方法很类似,一般是多了一个前缀"Reg",使用方法很基本上一样,这里就不给具体的Demo代码了。

就一般的应用来说,使用_winreg就足够了,但是_winreg有一个问题,如果Python是32位的,并且是运行在64位的操作系统上时就会有一点小问题,由于操作系统会进行注册表的重定向,32位的程序无法访问64位应用程序的注册表。在Python2.6以前这个问题都没有解决,在Python2.7中通过补丁的形式修正了这个问题(http://bugs.python.org/issue7347)。

通过例子来说明一下这个问题,假设我们的操作系统是64位的,然后在上面安装了32位的Python,看如下的Python代码:
 

import _winreg
key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,r"Software\Microsoft\Windows")
newKey = _winreg.CreateKey(key,"MyNewkey")

上面的代码的执行不会像预想那样创建如下的键:

"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows"

而是会创建如下的键:

"HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows"

因为在64位的windows操作系统下,64位的程序和32位程序的注册表是分开的,32位应用程序对注册表的操作(读、写)都会被重定向到Wow6432Node下面, 64位应用程序的访问注册表的行为则没有变化。因此如果我们的32位应用程序确实要访问64位程序所用到的注册表的话,就会有点问题。由于_winreg本身的问题,它对这种情况的支持不太充分,对windows api的封装有一些bug,这个时候就需要用到 win32api 模块。

下面用win32api提供的方法来修改上面的代码如下:
 

import win32api
 
import win32con
 
key = win32api.RegCreateKeyEx(win32con.HKEY_LOCAL_MACHINE, r"Software\Microsoft\Windows", win32con.WRITE_OWNER |win32con.KEY_WOW64_64KEY|win32con.KEY_ALL_ACCESS)
win32api.RegSetValueEx (key,"MyNewkey", 0, win32con.REG_SZ, keyValue)

上面的win32con.KEY_WOW64_64KEY意思就是直接访问64位注册表,不要进行重定向,默认的参数是win32con.KEY_WOW64_32KEY。

Python 相关文章推荐
Python将xml和xsl转换为html的方法
Mar 10 Python
PYTHON压平嵌套列表的简单实现
Jun 08 Python
Python2实现的LED大数字显示效果示例
Sep 04 Python
Python实现快速计算词频功能示例
Jun 25 Python
python 爬取学信网登录页面的例子
Aug 13 Python
在TensorFlow中屏蔽warning的方式
Feb 04 Python
Python如何读取、写入CSV数据
Jul 28 Python
Python定义一个Actor任务
Jul 29 Python
基于PyInstaller各参数的含义说明
Mar 04 Python
python爬取新闻门户网站的示例
Apr 25 Python
如何判断pytorch是否支持GPU加速
Jun 01 Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
Apr 08 Python
编写简单的Python程序来判断文本的语种
Apr 07 #Python
Python实现在线程里运行scrapy的方法
Apr 07 #Python
Python实现从脚本里运行scrapy的方法
Apr 07 #Python
Python自定义scrapy中间模块避免重复采集的方法
Apr 07 #Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 #Python
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 #Python
Python中使用pprint函数进行格式化输出的教程
Apr 07 #Python
You might like
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
Symfony2之session与cookie用法小结
2016/03/18 PHP
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
详解javascript函数的参数
2015/11/10 Javascript
jquery实现具有嵌套功能的选项卡
2016/02/12 Javascript
浅谈js中调用函数时加不加括号的问题
2016/07/28 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
2016/09/19 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
一文让你彻底搞清楚javascript中的require、import与export
2017/09/24 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
2019/04/22 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
基于vue+echarts数据可视化大屏展示的实现
2020/12/25 Vue.js
Python环境变量设置方法
2016/08/28 Python
Python入门之三角函数sin()函数实例详解
2017/11/08 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
python如何获取apk的packagename和activity
2020/01/10 Python
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
linux面试题参考答案(2)
2015/12/06 面试题
实习自我鉴定范文
2013/10/30 职场文书
向领导表决心的话
2014/03/11 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
学校师德师风整改方案
2014/10/28 职场文书
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang