操作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代码实例
Feb 04 Python
Python中return语句用法实例分析
Aug 04 Python
Python实现针对中文排序的方法
May 09 Python
python使用socket创建tcp服务器和客户端
Apr 12 Python
Python处理CSV与List的转换方法
Apr 19 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
Python3.5装饰器典型案例分析
Apr 30 Python
Python实现字符型图片验证码识别完整过程详解
May 10 Python
python监控nginx端口和进程状态
Sep 06 Python
python基础之while循环语句的使用
Apr 20 Python
pytorch 6 batch_train 批训练操作
May 28 Python
Python一些基本的图像操作和处理总结
Jun 23 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
支付宝服务窗API接口开发php版本
2016/07/20 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
js判断当前页面用什么浏览器打开的方法
2016/01/06 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
web.py获取上传文件名的正确方法
2014/08/26 Python
python threading模块操作多线程介绍
2015/04/08 Python
Python选课系统开发程序
2016/09/02 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
对numpy中轴与维度的理解
2018/04/18 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
京东全球售:直邮香港,澳门,台湾,美国,澳大利亚等地区
2017/09/24 全球购物
Linux如何命名文件--使用文件名时应注意
2014/05/29 面试题
工程造价专业大专生求职信
2013/10/06 职场文书
四年级科学教学反思
2014/02/10 职场文书
会议室标语
2014/06/21 职场文书
教书育人演讲稿
2014/09/11 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
消防演习感想
2015/08/10 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript
Java Spring Lifecycle的使用
2022/05/06 Java/Android