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%丢失),