Python中调用Linux命令并获取返回值
方法一、使用os模塊的system方法:
os.system(cmd),其返回值是shell指令運(yùn)行后返回的狀態(tài)碼,int類型,0表示shell指令成功執(zhí)行,256/512表示未找到,該方法適用于shell命令不需要輸出內(nèi)容的場(chǎng)景。
os.system(cmd)會(huì)啟動(dòng)子進(jìn)程,在子進(jìn)程中執(zhí)行cmd,如果cmd有執(zhí)行內(nèi)容,會(huì)在標(biāo)準(zhǔn)輸出顯示。
舉例說(shuō)明:
列舉當(dāng)前目錄下的所有文件。
import os val = os.system('ls -al') print val #輸出為0 val = os.system('ls -al non_exist_folder') print val #輸出為512 val = os.system('ls -al|grep non_exist_val') print val #輸出為256方法二、使用os.popen(),
該方法以文件的形式返回shell指令運(yùn)行后的結(jié)果,需要獲取內(nèi)容時(shí)可使用read()或readlines()方法。
os.system(cmd)或os.popen(cmd),前者返回值是腳本的退出狀態(tài)碼,后者的返回值是腳本執(zhí)行過(guò)程中的輸出內(nèi)容。實(shí)際使用時(shí)視需求情況而選擇。
舉栗:
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' import os os.popen('ls -l') 輸出:<open file 'ls -l', mode 'r' at 0x7f46af044930> os.popen('ls -l').read() #返回字符串類型的結(jié)果 輸出:'total 0\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt\n' os.popen('ls -l').readlines() #返回一個(gè)list類型的結(jié)果 輸出:['total 0\n', '-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n', '-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt\n']val=os.popen('ls -al') for i in val.readlines():print i方法三、使用commands模塊,有三個(gè)方法可以使用:
(1)commands.getstatusoutput(cmd),其以元組(status,output)的形式返回命令執(zhí)行后的返回狀態(tài)和執(zhí)行結(jié)果。其中,對(duì)cmd的執(zhí)行實(shí)際上是按照{(diào)cmd;} 2>&1的方式,所以output中包含控制臺(tái)輸出信息或者錯(cuò)誤信息,output中不包含尾部的換行符。
(2)commands.getoutput(cmd),返回cmd的輸出結(jié)果。
(3)commands.getstatus(file),返回ls -l file的執(zhí)行結(jié)果字符串,調(diào)用了getoutput,不建議使用此方法
import commands aa=commands.getstatusoutput('ls -l') 輸出:(0, 'total 0\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt') #返回一個(gè)元組,對(duì)比os.popen(cmd)的返回結(jié)果,發(fā)現(xiàn)output中不包含尾部的換行符 bb=commands.getoutput('ls -l') #只返回執(zhí)行結(jié)果 輸出:'total 0\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt'cc=commands.getstatus('a.txt') #查詢某個(gè)文件的狀態(tài) 輸出:'-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt' dd=commands.getstatusoutput('ls -l non_exist_folder') #執(zhí)行結(jié)果中包含控制臺(tái)輸出信息或者錯(cuò)誤信息 輸出:(512, "ls: cannot access 'non_exist_folder': No such file or directory")os.popen(cmd)返回的是一個(gè)類文件對(duì)象,commands.getoutput(cmd)返回了字符串類型的輸出結(jié)果,很多情況下用起來(lái)要更方便些。
方法四、subprocess模塊,
允許創(chuàng)建很多子進(jìn)程,創(chuàng)建的時(shí)候能指定子進(jìn)程和子進(jìn)程的輸入、輸出、錯(cuò)誤輸出管道,執(zhí)行后能獲取輸出結(jié)果和執(zhí)行狀態(tài)。
(1)subprocess.run():python3.5中新增的函數(shù), 執(zhí)行指定的命令, 等待命令執(zhí)行完成后返回一個(gè)包含執(zhí)行結(jié)果的CompletedProcess類的實(shí)例。
(2)subprocess.call():執(zhí)行指定的命令, 返回命令執(zhí)行狀態(tài), 功能類似os.system(cmd)。
(3)subprocess.check_call():python2.5中新增的函數(shù), 執(zhí)行指定的命令, 如果執(zhí)行成功則返回狀態(tài)碼, 否則拋出異常。
說(shuō)明:
subprocess.run(args, *, stdin=None, input=None, stdout=None,stderr=None, shell=False, timeout=None, check=False,universal_newlines=False)
subprocess.call(args, *, stdin=None, stdout=None, stderr=None,shell=False, timeout=None)
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None,shell=False, timeout=None)
args:表示shell指令,若以字符串形式給出shell指令,如"ls -l “則需要使shell = Ture。否則默認(rèn)以數(shù)組形式表示shell變量,如"ls”,"-l"。
當(dāng)使用比較復(fù)雜的shell語(yǔ)句時(shí),可以先使用shlex模塊的shlex.split()方法來(lái)幫助格式化命令,然后在傳遞給run()方法或Popen。
subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()都是通過(guò)對(duì)subprocess.Popen的封裝來(lái)實(shí)現(xiàn)的高級(jí)函數(shù),因此如果我們需要更復(fù)雜功能時(shí),可以通過(guò)subprocess.Popen來(lái)完成
使用舉栗:
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' import shlex import subprocess command='ls -l' args=shlex.split('ls -l') bb=subprocess.Popen(args) #bb是一個(gè)Popen的對(duì)象,該對(duì)象不能通過(guò)read()或readlines()來(lái)讀取 輸出:total 0 -rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt -rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt #在該處需要點(diǎn)擊換行符才會(huì)結(jié)束 aa=subprocess.call('ls -l',shell=True) #其返回值為shell命令的執(zhí)行返回碼 輸出:total 0 -rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt -rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt #直接返回在Python3中的情況
期望:想要在Python3中執(zhí)行curl命令并返回執(zhí)行結(jié)果,返回結(jié)果時(shí)json體
分析:
cmd='curl -s "http://127.0.0.1:8080/xxxxx"'1)使用os.system(cmd) 無(wú)法獲取輸出內(nèi)容
2)使用os.popen(cmd).read()可以獲取到返回的json體${aa},通過(guò)json.loads(${aa})可以將json體轉(zhuǎn)為字典樣式
3)commands模塊在Python3.0中被廢棄了
4)subprocess.getstatusoutput(cmd)輸出結(jié)果類似于python2中的commands.getstatusoutput(cmd),返回一個(gè)元組,元組的第2個(gè)值是執(zhí)行結(jié)果${aa},通過(guò)json.loads(${aa})可以將json體轉(zhuǎn)為字典樣式。
總結(jié)
以上是生活随笔為你收集整理的Python中调用Linux命令并获取返回值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python 的类其实是一个特殊的对象
- 下一篇: 用Python获取Linux资源信息的三