操作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 的 Socket 编程
Mar 24 Python
Python写入数据到MP3文件中的方法
Jul 10 Python
Python xlwt设置excel单元格字体及格式
Apr 18 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
python2.7读取文件夹下所有文件名称及内容的方法
Feb 24 Python
Python实现简单的文本相似度分析操作详解
Jun 16 Python
Python爬虫常用库的安装及其环境配置
Sep 19 Python
python实现一个简单的ping工具方法
Jan 31 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
python sorted函数的小练习及解答
Sep 18 Python
python实现AdaBoost算法的示例
Oct 03 Python
Python趣味挑战之教你用pygame画进度条
May 31 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格式化日期和时间格式化示例分享
2014/02/24 PHP
PHP调试函数和日志记录函数分享
2015/01/31 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
最新28个很棒的jQuery 教程
2011/05/28 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
js中哈希表的几种用法总结
2014/01/28 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
2017/02/23 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
深入浅出es6模板字符串
2017/08/26 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
嘻哈珠宝品牌:KRKC&CO
2020/10/19 全球购物
高中生毕业学习总结的自我评价
2013/11/14 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
分居协议书范本
2014/11/03 职场文书