winreg subprocess模块
### subprocess
- 用与执行cmd指令
- 基本应用
import subprocess
#创建对象,括号里面可以写要打开文件的路径,或者cmd要执行的指令,输入文件时候打开文件,输入cmd指令打印返回信息
proc = subprocess.Popen(("陈慧娴-千千阙歌.mp3"),shell = True,
stdin = subprocess.PIPE,
stdout=subprocess.PIPE,
stderr = subprocess.PIPE,
universal_newlines=True, #这句相当把b编码解码了,如果不加输出的是b字节串,需要自己用decode解码
)
rendmsg = proc.stdout.read() #读取输出信息
# proc.communicate() #官方建议用这个函数,但是实际不接已经运行
# if subprocess.Popen.poll(proc)==0: #检查子进程是否完成
# break
print(rendmsg)
- 实例应用
- 调用shell逐行输出拼包信息
import subprocess
#实例化对象
proc = subprocess.Popen(("ping 127.0.0.1 -n 5 -l 1500"),shell = True,
stdin = subprocess.PIPE,
stdout=subprocess.PIPE,
stderr = subprocess.PIPE,
universal_newlines=True, #这句相当把b编码解码了,如果不加输出的是b字节串,需要自己用decode解码
)
while True:
msg = proc.stdout.readline() #按行输出
print(msg)
# if not len(msg):
# break
if subprocess.Popen.poll(proc)==0: #判断子进程是否结束
break
结果:逐行打印输出拼包结果
#例子2
#官方建议用communicate操作,说用rendline容易卡死,未实际验证,但是用communicate只能完成一次性输出结果,不能实时输出,所有用sys可以实时输出,但是用windowe会出现乱码,因为windows系统是bgk编码,而模块是utf-8
import subprocess
import sys
def run_shell(shell):
cmd = subprocess.Popen(shell, stdin=subprocess.PIPE, stderr=sys.stderr, close_fds=True,
stdout=sys.stdout, universal_newlines=True, shell=True, bufsize=1)
cmd.communicate()
return cmd.returncode
if __name__ == '__main__':
print(run_shell("ping www.baidu.com"))
- 打开文件
proc = subprocess.Popen(r'F:\重要资料\安富来\02.配套例程\01.出厂程序(1个综合例子)\NAND Flash的文件\Music\陈慧娴-千千阙歌.mp3',shell = True,)
结果:打开F:盘路径的文件
- 运行cmd下指令
proc = subprocess.Popen("ipconfig",shell = True,
stdout = subprocess.PIPE,
)
print(proc.stdout.read().decode("gbk"))
结果:打印输出网络ip信息
- 更改ip地址
import subprocess
def run_shell(shell):
cmd = subprocess.Popen(shell, stdin=subprocess.PIPE, stderr=subprocess.PIPE,
stdout=subprocess.PIPE, universal_newlines=True, shell=True, bufsize=1)
print(cmd.stdout.read())
netlinkname = '"本地连接"'
addr = "26.0.0.2"
gateway = "26.0.0.1"
inp_cmd = 'netsh interface ip set address name=%s source=static addr=%s gateway=%s' %(netlinkname,addr,gateway)
print(inp_cmd)
if __name__ == '__main__':
run_shell(inp_cmd)
run_shell("ipconfig /all")
### winreg
- 用于更改windows注册表
- 注册表的结构
注册表由键(key,或称“项”)、子键(subkey,子项)和值项(value)构成。一个键就是树状数据结构中的一个节点,而子键就是这个节点的子节点,子键也是键。一个值项则是一个键的一条属性,由名称(name)、数据类型(datatype)以及数据(data)组成。一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值
- winreg函数
- key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,r"SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\{2E909A7F-C982-475D-A0E9-1FE17B29286C}",0,winreg.KEY_ALL_ACCESS)
- 打开键,并设置操作权限
- winreg.DeleteKey(key, "Advanced")
- 删除键
- winreg.DeleteValue(key, "IconUnderline")
- 删除键值
- newKey = winreg.CreateKey(key,"MyNewkey")
- 创建新键(key下面的一个文件夹,并且里面有默认键值项)
- winreg.SetValue(newKey,"ValueName",0,"ValueContent")
- 给新键增加值
- value, type1 = winreg.QueryValueEx(key, "IPAddress")
- 通过键名称查询键值
- winreg.SetValueEx(key, '*SpeedDuplex', 0, winreg.REG_SZ, '2')
- 通过名称更改键项目键值、类型
- name, value, type1 = winreg.EnumValue(key, i)
- 通过i索引遍历所有键名称和键值,类型
- key = winreg.ConnectRegisty("IP地址或者机器名",winreg.HKEY_CURRENT_USER)
- 远程登录
- 更改网卡速率
import winreg
# "0"="自动侦测"
# "1"="10 Mbps 半双工"half-duplex
# "2"="10 Mbps 全双工" full duplex
# "3"="100 Mbps 半双工"half-duplex
# "4"="100 Mbps 全双工"full duplex
# "6"="1.0 Gbps 全双工"full duplex
#winreg.HKEY_LOCAL_MACHINE是key键,
# r"SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0007"是subkey子键(文件夹)
#winreg.KEY_ALL_ACCESS是设置权限(这个值有几个选项),可读、可改,这里是所有权限
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,r"SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0007",0,winreg.KEY_ALL_ACCESS)
#获取该键的所有键值,因为没有方法可以获取键值的个数,所以只能用这种方法进行遍历
try:
i = 0
while 1:
#EnumValue方法用来枚举键值,EnumKey用来枚举子键
name, value, type1 = winreg.EnumValue(key, i)
print(name+"|"+str(value)+"|"+str(type1),type(value))
i += 1
except WindowsError:
print("报错")
#修改键值项的属性,数据,*SpeedDuplex是名称,winreg.REG_SZ是类型(注意这个有几种类型),'0'是数据
winreg.SetValueEx(key, '*SpeedDuplex', 0, winreg.REG_SZ, '2')
value, type1 = winreg.QueryValueEx(key, "*SpeedDuplex") #查询键值项值
print(value,type(value))
if value == "2":
print("10M全双工")
- 更改ip地址
import winreg
#winreg.HKEY_LOCAL_MACHINE是key键,
#r"SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\{2E909A7F-C982-475D-A0E9-1FE17B29286C}"是subkey子键
#winreg.KEY_ALL_ACCESS是设置权限(这个值有几个选项),可读、可改,这里是所有权限
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,r"SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\{2E909A7F-C982-475D-A0E9-1FE17B29286C}",0,winreg.KEY_ALL_ACCESS)
#获取该键的所有键值,因为没有方法可以获取键值的个数,所以只能用这种方法进行遍历
try:
i = 0
while 1:
#EnumValue方法用来枚举键值,EnumKey用来枚举子键
name, value, type1 = winreg.EnumValue(key, i)
print(name+"|"+str(value)+"|"+str(type1),type(value))
i += 1
except WindowsError:
print("报错")
#修改键值项的属性,数据,IPAddress是名称,winreg.REG_MULTI_SZ是类型(注意这个有几种类型),["26.0.0.2"]是数据
winreg.SetValueEx(key, 'IPAddress', 0, winreg.REG_MULTI_SZ,["26.0.0.3"])
value, type1 = winreg.QueryValueEx(key, "IPAddress") #查询获取键值项的数据
print(value,type(value))
### winreg
- 操作注册表
浙公网安备 33010602011771号