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

pythonsubprocess执行外部命令常用方法

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
70607
发表于 2024-9-5 15:08:08 | 显示全部楼层 |阅读模式
subprocess模块是Python标准库中的一个模块,用于创建和控制子进程。它提供了一种在Python程序中调用其他外部命令、执行系统命令和与系统进程进行交互的方法。常用的有两种方法:subprocess.run(),subprocess.Popen()1.subprocess.run()方法subprocess.run()是subprocess模块中一个常用的函数,也是官方推荐的方法,它用于运行命令并等待其完成。subprocess.run(args,*,stdin=None,input=None,stdout=None,stderr=None,shell=False,timeout=None,check=False,encoding=None,errors=None,text=None,cwd=None,env=None,universal_newlines=None)常用参数说明:args:要执行的命令及其参数组成的列表或字符串。stdin:标准输入流(默认为None)。input:作为子进程的输入发送的数据(默认为None)。stdout:标准输出流(默认为None,表示将输出传递给父进程)。stderr:标准错误流(默认为None,表示将错误信息传递给父进程)。shell:是否通过系统shell执行命令(默认为False,即不使用shell执行)。timeout:超时时间,指定子进程允许执行的最长时间(默认为None)。check:如果子进程返回非零状态码,则抛出CalledProcessError异常(默认为False)。cwd:子进程的当前工作目录(默认为None,表示使用父进程的当前工作目录)。subprocess.run()的详细用法介绍示例1:运行命令并等待其完成importsubprocesssubprocess.run(['ls','-l'])123'运行运行执行结果:示例2:通过shell执行命令importsubprocesssubprocess.run('echoHello,World!',shell=True)123'运行运行执行结果:示例3:传递输入给子进程importsubprocesssubprocess.run(['grep','hello'],input=b'Hello,world!\nHello,Python!')打印结果:![](http://rxfj6v915.hn-bkt.clouddn.com/FjLlvbwamnPX_cS27QZph2vSQ7aM)12345示例4:设置超时时间importsubprocesstry:subprocess.run(['sleep','10'],timeout=5)exceptsubprocess.TimeoutExpired:print("Timeoutreached")123456'运行运行打印结果:示例5:指定工作目录importsubprocesssubprocess.run(['ls','-l'],cwd='/opt/')123'运行运行打印结果:示例6:checkimportsubprocesssubprocess.run(['ls','huaei'],cwd='/opt/',check=True)123打印结果:示例7:捕获脚本的输出#使用管道捕获输出a=subprocess.run('ls/opt/huawei',shell=True,stdout=subprocess.PIPE)12打印结果:2.subprocess.Popen()方法subprocess.Popen()是subprocess模块中用于创建子进程的函数之一。它提供了更灵活的控制和处理子进程的能力。subprocess.Popen(args,bufsize=-1,executable=None,stdin=None,stdout=None,stderr=None,preexec_fn=None,close_fds=True,shell=False,cwd=None,env=None,universal_newlines=False,startupinfo=None,creationflags=0,restore_signals=True,start_new_session=False,pass_fds=(),*,encoding=None,errors=None)常用参数说明:args:要执行的命令及其参数组成的列表或字符串。executable:可执行文件路径或命令名称(默认为None)。stdin:标准输入流(默认为None)。stdout:标准输出流(默认为None)。stderr:标准错误流(默认为None)。preexec_fn:子进程创建前要调用的可调用对象(默认为None)。close_fds:在子进程中关闭不必要的文件描述符(默认为True)。shell:是否通过系统shell执行命令(默认为False)。cwd:子进程的当前工作目录(默认为None,表示使用父进程的当前工作目录)。env:子进程的环境变量(默认为None,表示使用父进程的环境变量)。universal_newlines:各种换行符统一成’\n’。subprocess.Popen()的详细用法介绍示例1:运行命令并捕获输出importsubprocessprocess=subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE)output,error=process.communicate()print(output.decode())12345'运行运行打印结果:示例2:传递输入给子进程并获取输出process=subprocess.Popen(['grep','hello'],stdin=subprocess.PIPE,stdout=subprocess.PIPE)#communicate:参数是标准输入,返回标准输出和标准出错output,error=process.communicate(input=b'hello,world!')print(output)12345打印结果:示例3:后台执行命令subprocess.Popen(['sleep','10'])1打印结果:示例4:通过shell执行命令subprocess.Popen('echoHello,World!',shell=True)1打印结果:示例5:指定工作目录和环境变量subprocess.Popen(['ls','-l'],cwd='/path/to/directory',env={'VAR':'value'})1poll()方法poll():该方法用于检查子进程是否已经结束,并返回子进程的返回码。如果子进程尚未结束,poll()会立即返回None;如果子进程已经结束,poll()会返回子进程的返回码。这个方法通常在你需要非阻塞地检查子进程状态时使用。importsubprocess#启动一个子进程process=subprocess.Popen(['echo','Hello,world!'],stdout=subprocess.PIPE)#检查子进程是否结束return_code=process.poll()ifreturn_codeisNone:print("子进程尚未结束")else:print(f"子进程已结束,返回码:{return_code}")123456789101112'运行运行打印结果:wait()方法wait():该方法用于等待子进程的结束,并返回子进程的返回码。如果子进程尚未结束,wait()方法会阻塞当前进程直到子进程结束。这个方法通常在你需要等待子进程执行完毕并获取其返回码时使用。importsubprocess#启动一个子进程process=subprocess.Popen(['sleep','5'])#等待子进程结束并获取返回码return_code=process.wait()print(f"子进程已结束,返回码:{return_code}")123456789'运行运行打印结果:等待5秒钟程序执行完成,才打印返回码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-8 12:38 , Processed in 0.459074 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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