python调用Linux脚本或者shell指令的几种方法
python如何调用脚本或者shell指令?
方法1:
os.system()
只得到命令成功与否的执行状态
>>>importos>>>os.system('free-m')totalusedfreesharedbufferscachedMem:4744631101329-/+buffers/cache:42054Swap:1023415608>>>ret=os.system('free-m')totalusedfreesharedbufferscachedMem:4744641001230-/+buffers/cache:42053Swap:1023415608>>>printret#返回状态码是0,表示shell执行成功0
方法2:
os.popen
通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。但是无法读取程序执行的返回值)
>>>importos>>>output=os.popen('free-mt')>>>printoutput.read()totalusedfreesharedbuff/cacheavailableMem:782334452156441623864Swap:30712702801Total:1089537163016
方法3:
commands.getstatusoutput()&&commands.getoutput()
commands.getstatusoutput() 既可以输出执行成功与否的状态,也会输出执行结果
commands.getoutput() 只输出执行结果
>>>importcommands>>>(status,output)=commands.getstatusoutput('free-mt')>>>printstatus0>>>printoutputtotalusedfreesharedbuff/cacheavailableMem:782334751886441593834Swap:30712702801Total:1089537462989>>>output=commands.getoutput('free-mt')>>>printoutputtotalusedfreesharedbuff/cacheavailableMem:782334751886441593834Swap:30712702801Total:1089537462989
当命令调用错误时:
>>>(status,output)=commands.getstatusoutput('free-aaa')>>>printstatus256>>>printoutputfree:invalidoption--'a'Usage:free[options]Options:-b,--bytesshowoutputinbytes-k,--kiloshowoutputinkilobytes-m,--megashowoutputinmegabytes-g,--gigashowoutputingigabytes--terashowoutputinterabytes-h,--humanshowhuman-readableoutput--siusepowersof1000not1024-l,--lohishowdetailedlowandhighmemorystatistics-t,--totalshowtotalforRAM+swap-sN,--secondsNrepeatprintingeveryNseconds-cN,--countNrepeatprintingNtimes,thenexit-w,--widewideoutput--helpdisplaythishelpandexit-V,--versionoutputversioninformationandexitFormoredetailsseefree(1).
方法4:
subprocess子进程(功能强大,最常使用的方式)
subprocess模块是python从2.4版本开始引入的模块。主要用来取代 一些旧的模块方法,如os.system、os.spawn*、os.popen*、commands.*等。subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。
(1)subprocess.call执行命令,并返回状态,类似os.system(),shell=True可以直接调用命令,而shell=False命令和参数需要分开
>>>output=subprocess.call(['free','-mt'],shell=False)totalusedfreesharedbuff/cacheavailableMem:782334462096441673863Swap:30712702801Total:1089537163011>>>printoutput0>>>output=subprocess.call('free-mt',shell=True)totalusedfreesharedbuff/cacheavailableMem:782334452096441673863Swap:30712702801Total:1089537163010>>>printoutput0
(2)subprocess.check_call用法与subprocess.call()类似,区别是,当返回值不为0时,还会抛出python层面的异常
>>>output=subprocess.call('la-ltrh',shell=True)/bin/sh:la:commandnotfound>>>output=subprocess.check_call('la-ltrh',shell=True)/bin/sh:la:commandnotfoundTraceback(mostrecentcalllast):File"<stdin>",line1,in<module>File"/usr/lib64/python2.7/subprocess.py",line542,incheck_callraiseCalledProcessError(retcode,cmd)subprocess.CalledProcessError:Command'la-ltrh'returnednon-zeroexitstatus127
(3)suprocess.Popen()
在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。这个时候我们就需要使用到suprocess.Popen()方法。该方法有以下参数:
args:shell命令,可以是字符串,或者序列类型,如list,tuple。
stdin,stdout,stderr:分别表示程序的标准输入,标准输出及标准错误
shell:True或False
cwd:用于设置子进程的当前目录
env:用于指定子进程的环境变量。如果env=None,则默认从父进程继承环境变量
universal_newlines:不同系统的的换行符不同,当该参数设定为true时,则表示使用\n作为换行符
如:在/usr/local/mysql下创建一个suprocesstest的目录:
>>>output=subprocess.Popen('mkdirsubprocesstest',shell=True,cwd='/usr/local/mysql')>>>output=subprocess.Popen('ls-ldsub*',shell=True,cwd='/usr/local/mysql')drwxr-xr-x2mysqladmindba6Mar516:12subprocesstest
使用标准输出stdout和标准错误stderr,不会把输出结果返回到显示屏上
>>>child1=subprocess.Popen('free-mt',shell=True)>>>totalusedfreesharedbuff/cacheavailableMem:782334462046441723863Swap:30712702801Total:1089537163006>>>child1=subprocess.Popen('free-mt',shell=True,stdout=subprocess.PIPE)>>>output=child1.communicate()>>>printoutput('totalusedfreesharedbuff/cacheavailable\nMem:782334462016441753862\nSwap:30712702801\nTotal:1089537173002\n',None)>>>child1=subprocess.Popen('lss',shell=True,stdout=subprocess.PIPE)/bin/sh:lss:commandnotfound>>>child1=subprocess.Popen('lss',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)>>>output=child1.communicate()>>>printoutput('','/bin/sh:lss:commandnotfound\n')
将一个子进程的输出,作为另一个子进程的输入,相当于管道,如:cat /etc/passwd|grep 'root'
>>>importsubprocess>>>child1=subprocess.Popen(["cat","/etc/passwd"],stdout=subprocess.PIPE)>>>child2=subprocess.Popen(["grep","root"],stdin=child1.stdout,stdout=subprocess.PIPE)>>>output=child2.communicate()>>>printoutput('root:x:0:0:root:/root:/bin/bash\noperator:x:11:0:operator:/root:/sbin/nologin\n',None)
封装一个函数:功能是调用系统命令:
importsubprocessdeff1(cmd):a=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)output=a.stdout.read()code=a.wait()returncode,outputprintf1('ls')printf1('lll')输出结果:>>>printf1('ls')(0,'tb.txt\ntest2.py\ntest.py\n')>>>printf1('lll')(127,'/bin/sh:lll:commandnotfound\n')
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。