Python中Subprocess的不同函数解析
以前我一直用os.system()处理一些系统管理任务,因为我认为那是运行linux命令最简单的方式.
我们能从Python官方文档里读到应该用subprocess模块来运行系统命令.subprocess模块允许我们创建子进程,连接他们的输入/输出/错误管道,还有获得返回值。
subprocess模块打算来替代几个过时的模块和函数,比如:os.system,os.spawn*,os.popen*,popen2.*命令。
让我们来看一下subprocess有哪些不同的函数.
subprocess.call()
执行由参数提供的命令.
我们可以用数组作为参数运行命令,也可以用字符串作为参数运行命令(通过设置参数shell=True)
注意,参数shell默认为False
我们用subprocess.call()来做一个统计磁盘的例子:
subprocess.call(['df','-h'])
下面的例子把shell设置为True
subprocess.call('du-hs$HOME',shell=True)
注意,python官方文档里对参数shell=True陈述了一个警告:
Invokingthesystemshellwithshell=Truecanbeasecurityhazardifcombined withuntrustedinput
现在,我们来看看输入与输出
InputandOutput
subprocess模块能阻止输出,当你不关心标准输出的时候是非常方便的.
它也使你通过一种正确的方式管理输入/输出,有条理地整合python脚本中的的shell命令.
ReturnCodes
通过subprocess.call的返回值你能够判定命令是否执行成功.
每一个进程退出时都会返回一个状态码,你可以根据这个状态码写一些代码。
stdin,stdoutandstderr
在使用subprocess时,有一个微妙的部分是怎么使用管道把命令连接起来.
管道表明一个新的子管道应该被创建.
默认的设置为None,意味着没有重定向发生
标准错误可以指向标准输出,表明子进程的错误信息会被捕获到和标准输出同一个文件.
subprocess.Popen()
subprocess模块中基本的进程创建和管理由Popen类来处理.
subprocess.popen是用来替代os.popen的.
我们来做一些真实的例子,subprocess.Popen需要一个数组作为参数:
importsubprocess p=subprocess.Popen(["echo","helloworld"],stdout=subprocess.PIPE) printp.communicate() >>>('helloworld ',None)
注意,虽然你可以使用"shell=True",但并不推荐这样的方式.
如果你知道你只用几个有限的函数,比如Popen和PIPE,你可以单单指定这几个函数:
fromsubprocessimportPopen,PIPE p1=Popen(["dmesg"],stdout=PIPE) printp1.communicate()
Popen.communicate()
communicate()函数返回一个tuple(标准输出和错误).
Popen.communicate()和进程沟通:发送数据到标准输入.从标准输出和错误读取数据直到遇到结束符.等待进程结束.
输入参数应该是一个字符串,以传递给子进程,如果没有数据的话应该是None.
基本上,当你用communicate()函数的时候意味着你要执行命令了.
用subprocess写Ping程序
我们先问用户地址,然后用ping请求这个地址.
#Importthemodule importsubprocess #Asktheuserforinput host=raw_input("Enterahosttoping:") #Setuptheechocommandanddirecttheoutputtoapipe p1=subprocess.Popen(['ping','-c2',host],stdout=subprocess.PIPE) #Runthecommand output=p1.communicate()[0] printoutput
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。