找回密码
 会员注册
查看: 23|回复: 0

python实用性浅谈subprocess中Popen()和run()方法

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
72128
发表于 2024-9-7 15:47:45 | 显示全部楼层 |阅读模式
文章目录run()和Popen()介绍run()和Popen()用法分享一波提示:以下仅为本人个人观点,仅供参考,不足之处欢迎评论,共勉run()和Popen()介绍subprocess的run()和Popen()都是子进程管理的方法,启动新的子进程并执行外部命令的方法.Popen:更底层、更灵活的接口。创建一个新的进程并根据给定的参数执行命令,不会因等待这个命令执行完成而阻塞别的子进程的执行。这使得你可以在子进程执行的同时,主进程可以继续执行其他任务,提供了异步执行的能力特点:非阻塞式命令提供了更多的参数,可以实时读取输出、向子进程发送数据或在子进程执行期间做其他事情适合需要与子进程进行复杂交互或需要细粒度控制的场景run:作为一个简单的接口来替代许多常见情况下的Popen调用,run()会执行给定的命令,等待命令完成特点:阻塞式命令:需要等待命令执行完自动处理标准输入、输出和错误流run()和Popen()用法run()方法:单一执行命令:[command]:字符串、字符串参数列表importsubprocesssubprocess.run([command])#ex:command='ls'subprocess.run([command])12345设置超时时间:使用timeout参数来设置命令超时时间,如果命令执行时间超时,将杀死子进程,并弹出TimeoutExpired异常,单位:秒importsubprocesscommand='adbshelltop'try:res=subprocess.run(command,timeout=5)exceptTimeoutErrorase:print(e)#触发异常则会报subprocess.TimeoutExpired:Command'adbshelltop'timedoutafter5.0seconds12345678状态码参数操作设置check参数获取状态码(布尔值),如果该参数设置为True,并且进程退出状态码不是0,则弹出CalledProcessError异常returncode获取状态码的值command='adbshelltop-n1-d1'res=subprocess.run(command,check=True)try:ifres.returncode==0:print(res.returncode)exceptCalledProcessErrorase:print(e)1234567Popen()方法:标准输入、输出、错误:参数stdin表示标准输入参数stdout表示标准输出:默认输出的值是二进制数据,可对输出值进行处理参数stderr表示标准错误句柄importsubprocesscommand='adbdevices'p=subprocess.Popen(command,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)#PIPE:连接到它们的输入/输出/错误管道,并获取它们的返回码out,err=p.communicate()#和子进程交互,发送和读取数据res=out.decode('utf-8')#将二进制码格式为UTF-8字符串print(res)print(err.decode('utf-8'))12345678使用poll()方法检查子进程是否结束:结束返回returncode,否则返回Nonecommand='adbdevices'p=subprocess.Popen(command,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)out,err=p.communicate()#和子进程交互,发送和读取数据res=out.decode('utf-8')ifp.poll()isNone:print("Processisstillrunning")else:print(res)12345678terminate()方法使用:停止子进程,command='adbdevices'p=subprocess.Popen(command,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)p.terminate()#停止子进程,后面将不会执行到,导致程序结果没有后续的输出值out,err=p.communicate()res=out.decode('utf-8')print(res)123456wait(timeout)方法:等待子进程终止,可以通过timeout参数设置超时时长,如果超过时长子进程如果没有执行结束,将会抛出异常TimeoutExpiredcommand='adbdevices'p=subprocess.Popen(command,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)out,err=p.communicate()res=out.decode('utf-8')p.wait(timeout=5)print(res)123456分享一波通过传递命令列表批量执行子进程:defshell(commands=None):ifcommandsisNone:commands=[]#进入shell中#进入shell中cmd=f''p=subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)#在打开当前shell窗口执行列表命令forcommandincommands:p.stdin.write(command.encode())p.stdin.write(b'\n')p.stdin.flush()1234567891011'运行运行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-11 01:55 , Processed in 0.539462 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表