python模块--subprocess
subprocess模块
subprocess模块用于帮助我们在python代码中去执行一些系统命令,在执行python程序时,该模块会创建出一个子进程,来运行外部程序。
该模块拥有多个方法,具体如下:
subprocess.call()
直接打印系统命令的执行结果,如果执行成功,返回状态码为0,否则为1,例如:
#执行成功importsubprocessCALL1=subprocess.call('ping127.0.0.1-n1',shell=True)print("Returncode:%d"%CALL1)
打印结果为:
正在Ping127.0.0.1具有32字节的数据:来自127.0.0.1的回复:字节=32时间<1msTTL=128127.0.0.1的Ping统计信息:数据包:已发送=1,已接收=1,丢失=0(0%丢失),往返行程的估计时间(以毫秒为单位):最短=0ms,最长=0ms,平均=0msReturncode:0
#执行失败CALL2=subprocess.call('ping1.1.1.2-n1',shell=True)print("Returncode:%d"%CALL2)
打印结果为:
正在Ping1.1.1.2具有32字节的数据:请求超时。1.1.1.2的Ping统计信息:数据包:已发送=1,已接收=0,丢失=1(100%丢失),Returncode:1
subprocess.check_call()
直接打印系统命令的执行结果,使用方法与subprocess.call()相同,只不过该函数会检测返回状态码,如果为1,则会抛出subprocess.CalledProcessError错误,例如:
importsubprocess#执行成功#CHECK_CALL1=subprocess.check_call('ping127.0.0.1-n1',shell=True)#print(CHECK_CALL1)#执行失败CHECK_CALL2=subprocess.check_call('ping1.1.1.2-n1',shell=True)print(CHECK_CALL2)
打印结果为:
正在Ping1.1.1.2具有32字节的数据:请求超时。1.1.1.2的Ping统计信息:数据包:已发送=1,已接收=0,丢失=1(100%丢失),Traceback(mostrecentcalllast):File"C:/Users/Administrator/PycharmProjects/first/subprocess/check_call.py",line7,in<module>CHECK_CALL2=subprocess.check_call('ping1.1.1.2-n1',shell=True)File"C:\Python3.6\lib\subprocess.py",line291,incheck_callraiseCalledProcessError(retcode,cmd)subprocess.CalledProcessError:Command'ping1.1.1.2-n1'returnednon-zeroexitstatus1.
可以结合try...expect...语句做异常处理。
subprocess.check_output()
不会将系统命令的执行结果直接打印出来,返回一个bytes类型的对象,该对象包含了系统命令的执行结果,如果执行失败会抛出subprocess.CalledProcessError错误,例如:
importsubprocess#执行成功CHECK_OUTPUT1=subprocess.check_output('ping127.0.0.1-n1',shell=True)print(type(CHECK_OUTPUT1))print(str(CHECK_OUTPUT1,'gbk'))
打印结果为:
<class'bytes'>正在Ping127.0.0.1具有32字节的数据:来自127.0.0.1的回复:字节=32时间<1msTTL=128127.0.0.1的Ping统计信息:数据包:已发送=1,已接收=1,丢失=0(0%丢失),往返行程的估计时间(以毫秒为单位):最短=0ms,最长=0ms,平均=0ms
subprocess.Popen()
上面几个函数都是Popen()的封装,主进程都会等待子进程执行完毕,Popen()创建的子进程不会被等待,相当于异步执行。
1.Popen()创建的对象有多个方法,可以针对子进程执行个性化操作,例如:
importsubprocessimporttimetime.clock()POPEN1=subprocess.Popen('ping127.0.0.1-n10',shell=True)print(POPEN1)print(time.clock())
打印结果为:
<subprocess.Popenobjectat0x02230810>0.06108553745727746#从时间上看,主程序很快就结束了
Popen()创建的对象方法包括:
POPEN1.poll()#检查子进程状态POPEN1.kill()#终止子进程POPEN1.terminate()#终止子进程POPEN1.send_signal()#向子进程发送信号pid属性包含了子进程的pid号
2.subprocess.Popen()另一个常用的功能是文本流控制,对应的"标准输入"、"标准输出"、"标准错误"分别是:
POPEN1.stdinPOPEN1.stdoutPOPEN1.stderr
subprocess.PIPE(为文本流提供一个缓存区)作为管道,可以用来连接标准输出和标准输入,例如:
POPEN2=subprocess.Popen('ping127.0.0.1-n1',shell=True,stdout=subprocess.PIPE)STDOUT2=POPEN2.stdout#print(str(STDOUT2.read(),'gbk'))POPEN3=subprocess.Popen('findstr数据包',shell=True,stdin=STDOUT2,stdout=subprocess.PIPE)STDOUT3=POPEN3.stdoutprint(str(STDOUT3.read(),'gbk'))
执行结果为:
数据包:已发送=1,已接收=1,丢失=0(0%丢失),
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。