subprocess模块和os.popen讲解
概述:
subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
运行python的时候,我们都是在创建并运行一个进程。像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序
subprocess 模块首先推荐使用的是它的 run 方法,更高级的用法可以直接使用 Popen 接口。
os.system和os.popen
#!/usr/bin/env python # -*- coding: utf-8 -*- import os ''' Python调用Shell,有两种方法:os.system(cmd)或os.popen(cmd)脚本执行过程中的输出内容。实际使用时视需求情况而选择。 两者的区别是: 1.os.system(cmd)的返回值是脚本的退出状态码,只会有0(成功),1,2 2.os.popen(cmd)返回脚本执行的输出内容作为返回值 3.system执行后结果直接打印在控制台,无法读取保存到文件&变量 4.popen执行后不会打印到控制台,可通过read()读取结果 ''' db='adb devices' ##___________________________________os.system_______________________________________ a=os.system(db) print(a)#成功就返回0 ##___________________________________os.popen()_______________________________________ b=os.popen(db) print(type(b))#打印类型#print(b.read().split('\n'))#以换行切割,不填为空格切割 ##print(b.read().split()[1])#查看切割后的下标元素(就是获取list的1个元素) ####直接读取 b=os.popen(db).read() print(b)
subprocess模块实例
#!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess import time,psutil #__________________________获取android日志______________________________________________________________________________________________ def denglu_get(device): #####------------------------获取并写入文件---------------------- subprocess.call('adb -s '+device+' logcat -c')#每次获取—先清理缓存 proc=subprocess.Popen(r'adb -s '+device+' logcat *:D|find "ChannelInterface uploadUserData HashMap">'+path+'/order_log/'+device+'_登录日志.txt', shell=True) time.sleep(30)#获取30秒内的日志 pobj = psutil.Process(proc.pid) #杀掉proc实例对应的进程 for c in pobj.children(recursive=True): c.kill() pobj.kill() #______________________执行命令______________________________________________________________________________________________________ a=subprocess.call(['adb', 'devices'], stdout=subprocess.DEVNULL)#不打印 # # ##____________________________________获取当前目录详情(不打印到控制台)_____________________________________________________ # p = subprocess.Popen('dir', stdout=subprocess.PIPE, shell=True) #stdout=subprocess.PIPE表示不显示到控制台,,不传stdout默认显示到控制台 # a=(p.stdout.read()).decode('gbk')#在windows下cmd信息需要gbk编码 # print(a) ####___________________________________执行cmd命令____________________________________________ aa=subprocess.run("adb devices",shell=True,stdout=subprocess.PIPE,timeout=2)#分别为:执行命令、是否是shell执行,控制台、超时时间 print('打印全部=',aa) print('标准输出=',aa.stdout) ###________________________________________cmd命令标准输出_______________________________________________________________________________ class Shell(object): '''函数接收执行命令''' def runCmd(self, cmd): print('cmd命令为: ',cmd) res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) sout, serr = res.communicate() #print('命令执行后的结果',sout.decode('gbk')) return res.returncode, sout, serr, res.pid #分别是返回码、标准输出、标准错误 shell = Shell()#创建对象 while True: enter = input('请输入值: ') print(enter) if enter == 'exit' or enter == 'bye': break else: result = shell.runCmd(enter) print("返回码:", result[0]) print("标准输出:", result[1]) print("标准错误:", result[2]) print("进程pid", result[3]) #_______________________________________执行命令并写入文件____________________________________________________________________ def chen(cmd): fd=open(r"C:\Users\Administrator\Desktop\daln_123.txt","a") data=subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True) all_data=data.stdout.read().decode('UTF-8') fd.write(all_data) fd.close() chen('adb devices')
相关连接:
https://www.cnblogs.com/zhou2019/p/10582716.html .............................subprocess模块
https://www.cnblogs.com/lincappu/p/8270709.html ...........................subprocess模块2
https://www.runoob.com/w3cnote/python3-subprocess.html ...........................subprocess模块3
浙公网安备 33010602011771号