python執(zhí)行l(wèi)inux系統(tǒng)命令的三種方式小結(jié)
前言
這是我在這個(gè)網(wǎng)站整理的筆記,有錯(cuò)誤的地方請(qǐng)指出
1. 使用os.system
os.system(cmd),其中cmd就是需要執(zhí)行的linux命令。該方式會(huì)阻塞主進(jìn)程,直到命令執(zhí)行結(jié)束并返回狀態(tài),如果返回的狀態(tài)值為0,表示命令正常執(zhí)行,如果不為0,則表示命令執(zhí)行異常。要注意的是,該方式執(zhí)行l(wèi)inux命令,會(huì)直接打印出命令執(zhí)行的結(jié)果,但是不會(huì)作為對(duì)象返回,因此程序無(wú)法直接獲取命令執(zhí)行的結(jié)果。
無(wú)法獲取命令執(zhí)行后的返回信息
import os os.system('ls')
2. 使用os.popen
os.popen(cmd)方式,不會(huì)阻塞主進(jìn)程,執(zhí)行命令的子進(jìn)程會(huì)和主進(jìn)程同步運(yùn)行,如果想要進(jìn)行阻塞,等到命令執(zhí)行完再執(zhí)行下一步,可以通過(guò)os.wait()函數(shù)等到子進(jìn)程執(zhí)行完畢。
os.popen()會(huì)返回一個(gè)對(duì)象,該對(duì)象可文件對(duì)象類似,支持文件對(duì)象的讀寫接口,該對(duì)象會(huì)保存命令執(zhí)行的結(jié)果,可以通過(guò)對(duì)象的read()函數(shù)獲取結(jié)果內(nèi)容。因此,該方式相比于os.system()的特點(diǎn)是,不阻塞子進(jìn)程,可以直接獲取命令執(zhí)行的結(jié)構(gòu)。
能夠獲取命令執(zhí)行后的返回信息
import os data=os.popen('ls').readlines() print(data)
3. 使用模塊 subprocess
subprocess.Popen(args,shell=True,stdout=f),其中args可以為字符串,也可以為一個(gè)列表,如果是字符串,那么會(huì)將其認(rèn)為是可執(zhí)行程序直接運(yùn)行,如果是一個(gè)列表,則會(huì)將其當(dāng)做是空格隔開的shell命令,此時(shí)需要將shell參數(shù)設(shè)為True,才行。例如subprocess.Popen(['ps','-ef'],shell=True),會(huì)顯示所有的進(jìn)程。這里需要注意的是,這里默認(rèn)環(huán)境是當(dāng)前主進(jìn)程,因此只會(huì)顯示當(dāng)前主進(jìn)程下所有的進(jìn)程信息,而不是整個(gè)系統(tǒng)的進(jìn)程信息。subprocess.Popen()返回的對(duì)象具有多個(gè)方法,默認(rèn)該方式對(duì)于命令執(zhí)行是非阻塞的,但是可以通過(guò)p.wait()進(jìn)行阻塞,其中p表示返回的對(duì)象,還可以通過(guò)pid屬性獲取進(jìn)程號(hào),kill()方法直接結(jié)束進(jìn)程等。
此外,對(duì)于命令的執(zhí)行結(jié)果,默認(rèn)是直接打印出來(lái),還可以通過(guò)stdout參數(shù)重定向到文件中,比如設(shè)置stdout參數(shù)為一個(gè)文件對(duì)象,就可以將結(jié)果輸出到文件中。如果該文件同時(shí)支持讀取模式,那么還可以先將文件指針seek到指定位置再讀取命令執(zhí)行后的輸出結(jié)果。(因?yàn)閷懭胼敵鼋Y(jié)果后,文件指針在文件最后,因此直接讀取是無(wú)法讀到內(nèi)容的,所以需要先seek到指定位置,比如0位置,才能讀?。?/p>
通過(guò)subprocess模塊可以更靈活地執(zhí)行命令,并獲取執(zhí)行后的返回信息。
import subprocess # 使用Popen執(zhí)行命令,并捕獲標(biāo)準(zhǔn)輸出 result = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) # 讀取并解碼標(biāo)準(zhǔn)輸出 output_bytes = result.stdout.read() output_str = output_bytes.decode('utf-8') # 輸出結(jié)果 print(output_str) # 或者逐行輸出結(jié)果 for line in output_str.splitlines(): print(line)
參數(shù)解釋:
shell=True
:指示在shell中運(yùn)行命令。stdout=subprocess.PIPE
:捕獲命令的標(biāo)準(zhǔn)輸出。stderr=subprocess.STDOUT
:將標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到標(biāo)準(zhǔn)輸出。
通過(guò)使用subprocess模塊,可以更方便地處理命令執(zhí)行的輸出,并在需要時(shí)對(duì)其進(jìn)行進(jìn)一步處理。
到此這篇關(guān)于python執(zhí)行l(wèi)inux系統(tǒng)命令的三種方式小結(jié)的文章就介紹到這了,更多相關(guān)python執(zhí)行l(wèi)inux系統(tǒng)命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用Berkeley DB數(shù)據(jù)庫(kù)實(shí)例
這篇文章主要介紹了python使用Berkeley DB數(shù)據(jù)庫(kù)的方法,以實(shí)例形式講述了完整的操作過(guò)程,并總結(jié)了具體的操作步驟,非常具有實(shí)用性,需要的朋友可以參考下2014-09-09深入解析Python中的__builtins__內(nèi)建對(duì)象
__builtins__ 是內(nèi)建模塊__builtin__中的對(duì)象,使用Python中的內(nèi)建函數(shù)時(shí)會(huì)通過(guò)__builtins__引導(dǎo),這里我們就來(lái)深入解析Python中的__builtins__內(nèi)建對(duì)象,需要的朋友可以參考下2016-06-06Pygame游戲開發(fā)之太空射擊實(shí)戰(zhàn)入門篇
相信大多數(shù)8090后都玩過(guò)太空射擊游戲,在過(guò)去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來(lái)自己動(dòng)手實(shí)現(xiàn)它,在編寫學(xué)習(xí)中回顧過(guò)往展望未來(lái),下面開始入門篇2022-08-08詳解解決Python memory error的問(wèn)題(四種解決方案)
這篇文章主要介紹了詳解解決Python memory error的問(wèn)題(四種解決方案),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08python如何實(shí)現(xiàn)排序,并標(biāo)上序號(hào)
這篇文章主要介紹了python如何實(shí)現(xiàn)排序,并標(biāo)上序號(hào),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Python和OpenCV進(jìn)行多尺度模板匹配實(shí)現(xiàn)
本文將實(shí)現(xiàn)如何將標(biāo)準(zhǔn)模板匹配擴(kuò)展到多尺度,使其可以處理模板和輸入圖像大小不同的匹配。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Flask框架通過(guò)Flask_login實(shí)現(xiàn)用戶登錄功能示例
這篇文章主要介紹了Flask框架通過(guò)Flask_login實(shí)現(xiàn)用戶登錄功能,結(jié)合實(shí)例形式較為詳細(xì)的分析了flask框架使用Flask_login實(shí)現(xiàn)用戶登陸功能的具體操作步驟、相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2018-07-07linux環(huán)境打包python工程為可執(zhí)行程序的過(guò)程
本次需求,在ubuntu上面開發(fā)的python代碼程序需要打包成一個(gè)可執(zhí)行程序然后交付給甲方,因?yàn)椴荒苤苯咏o源碼給甲方,所以尋找方法將python開發(fā)的源碼打包成一個(gè)可執(zhí)行程序,本次在ubuntu上打包python源碼的方法和在window上打包的有點(diǎn)類似,感興趣的朋友跟隨小編一起看看吧2024-01-01在python中使用requests 模擬瀏覽器發(fā)送請(qǐng)求數(shù)據(jù)的方法
今天小編就為大家分享一篇在python中使用requests 模擬瀏覽器發(fā)送請(qǐng)求數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12