python调用shell命令小结

在写python脚本的时候,经常需要调用系统命令,常用的python调用系统命令的方法主要有subprocess.call和os.popen。默认情况下subprocess.call的方法结果是返回值,即1或0,而os.popen则是命令运行的结果,可以用readlines(读取所有行,返回数组)或者read(读读取所有行,返回str)来读取。

subprocess类总主要的方法有:

subprocess.call:开启子进程,开启子进程,,运行命令,默认结果是返回值,不能try

subprocess.check_call:运行命令,默认结果是返回值,可以try

subprocess.check_out(2.7中才有这个方法) 开启子进程,运行命令,可以获取命令结果,可以try subprocess.Popen 开启子进程,运行命令,没有返回值,不能try,可以获取命令结果

subprocess.PIPE 初始化stdin,stdout,stderr,表示与子进程通信的标准流Popen.poll 检查子进程是否结束,并返回returncodePopen.wait等待子进程是否结束,并返回retrurncode

比如check_call的sample:

importsubprocessimporttracebackcmd=’hadoopfs-lshdfs://xxxxx’try:e=subprocess.check_call(cmd,shell=True,stdout=subprocess.PIPE)print”returncodeis:%s”%(str(e))#printstdout.read()exceptException,re:print”messageis:%s”%(str(re))traceback.print_exc()

分析subprocess的源码:

classCalledProcessError(Exception):#首先定义了一个exception,用来在check_call和check_output中raiseexceptiondef__init__(self,returncode,cmd,output=None):self.returncode=returncodeself.cmd=cmdself.output=outputdef__str__(self):return”Command’%s’returnednon-zeroexitstatus%d”%(self.cmd,self.returncode)……….defcall(*popenargs,**kwargs):returnPopen(*popenargs,**kwargs).wait()#call方法调用waitdefcheck_call(*popenargs,**kwargs):retcode=call(*popenargs,**kwargs)#调用call,返回返回值ifretcode:cmd=kwargs.get(“args”)ifcmdisNone:cmd=popenargs[0]raiseCalledProcessError(retcode,cmd)#可以抛出异常return0defcheck_output(*popenargs,**kwargs):if’stdout’inkwargs:raiseValueError(‘stdoutargumentnotallowed,itwillbeoverridden.’)process=Popen(stdout=PIPE,*popenargs,**kwargs)output,unused_err=process.communicate()#获取标准输出和标准错误输出retcode=process.poll()#检查子进程是否结束,并返回returncodeifretcode:cmd=kwargs.get(“args”)ifcmdisNone:cmd=popenargs[0]raiseCalledProcessError(retcode,cmd,output=output)returnoutput有时候我们需要在运行命令时可以获取返回值,获取结果,并且能够try。

可以对上面的代码进行组合

#-*-coding:utf8-*-importexceptionsimportsubprocessimporttracebackclassCalledCommandError(Exception):def__init__(self,returncode,cmd,errorlog,output):self.returncode=returncodeself.cmd=cmdself.output=outputself.errorlog=errorlogdef__str__(self):return”命令运行错误:’%s’,返回值:%s,错误信息:%s”%(self.cmd,str(self.returncode),self.errorlog)defrun_command_all(*popenargs,**kwargs):allresult={}cmd=popenargs[0]if’stdout’inkwargsor’stderr’inkwargs:raiseValueError(‘标准输出和标准错误输出已经定义,不需设置。’)process=subprocess.Popen(stdout=subprocess.PIPE,shell=True,stderr=subprocess.PIPE,*popenargs,**kwargs)output,unused_err=process.communicate()retcode=process.poll()ifretcode:#printretcode,cmd,unused_err,outputraiseCalledCommandError(cmd,retcode,errorlog=unused_err,output=output)allresult[‘cmd’]=cmdallresult[‘returncode’]=retcodeallresult[‘errorlog’]=unused_errallresult[‘outdata’]=outputreturnallresultif__name__==’__main__’:cmd=’hadoopfs-lsxxxx|wc-l’try:e=run_command_all(cmd)print”ok”exceptException,re:print(str(re))print”failed”traceback.print_exc()

本文出自 “菜光光的博客” 博客,请务必保留此出处

再怎么风光明媚的自家山川,

python调用shell命令小结

相关文章:

你感兴趣的文章:

标签云: