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

posted on 2021-01-21 14:47  chen_2987  阅读(1390)  评论(0)    收藏  举报

导航