python 執(zhí)行外部命令的幾種方式

os.system

  • 執(zhí)行的時候程序會打出cmd在linux上執(zhí)行的信息
  • 執(zhí)行命令成功返回為0较屿,否則為1
  • 如果想獲取在cmd輸出的內(nèi)容隧魄,是沒辦法獲到的
t2 = os.system("1adb devices")
t3 = os.system("adb devices")
print(t2)  # 打印為1
print(t3) # 打印為0

subprocess.call

  • 取代os.system隘蝎,但是也是無法獲取cmd輸出的內(nèi)容
import subprocess
t = subprocess.call('adb devices')
print(t) # 打印為0

os.popen

  • popen返回的是一個file對象,跟open打開文件一樣操作了狮含,r是以讀的方式打開
output = os.popen('adb devices')
print(output.read()) # 得到List of devices attached

subprocess.Popen

  • subprocess模塊代替os.systemos.popen,能夠得到命令輸出的值

shell參數(shù)

  • linux下几迄,當shell=False(默認)時,Popen使用os.execvp()來執(zhí)行子程序乓旗。args一般要是一個【列表】。如果args是個字符串的
    話屿愚,會被當做是可執(zhí)行文件的路徑,這樣就不能傳入任何參數(shù)了妆距。
subprocess.Popen("cat test.txt", shell=True)
這是因為它相當于
subprocess.Popen(["/bin/sh", "-c", "cat test.txt"])

stdin stdout stderr 參數(shù)

  • 分別表示程序的標準輸入、輸出蚪黑、錯誤句柄中剩。他們可以是PIPE忌穿,文件描述符或文件對象结啼,也可以設置為None表示從父進程繼承
  • 執(zhí)行結(jié)果使用管道輸出的實例:
pipe=subprocess.Popen("adb devices",shell=True,stdout=subprocess.PIPE).stdout
print(pipe.read()) # 得到值b'List of devices attached\r\n\r\n'
  • 執(zhí)行結(jié)果保存在文件實例
cmd = "adb shell ls /sdcard/ | findstr aa.png"  
fhandle = open(r"e:\aa.txt", "w")  
pipe = subprocess.Popen(cmd, shell=True, stdout=fhandle).stdout  
fhandle.close()
  • 子進程的文本流控制
#!/usr/bin/env python

import subprocess

child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print out
  • child1.stdout-->subprocess.PIPE
  • child2.stdin<--subprocess.PIPE
  • child2.stdout-->subprocess.PIPE
  • 相當于將child1.stdout-->child2.stdin->child2.stdout->subprocess.PIPE
  • subprocess.PIPE實際上為文本流提供一個緩存區(qū)。child1的stdout將文本輸出到緩存區(qū)朴译,隨后child2的stdin從該PIPE中將文本讀取走属铁。child2的輸出文本也被存放在PIPE中眠寿,直到communicate()方法從PIPE中讀取出PIPE中的文本焦蘑。
  • 要注意的是,communicate()是Popen對象的一個方法喇肋,該方法會阻塞父進程迹辐,直到子進程完成。
  • 我們還可以利用communicate()方法來使用PIPE給子進程輸入:
import subprocess
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei") //()不為空明吩,則寫入subprocess.PIPE,為空,則從subprocess.PIPE讀取
  • subprocess.PIPE-->child.stdin
  • commiuncate相當于寫入subprocess.PIPE详羡,然后child從subprocess.PIPE讀取
  • 利用python的subprocess模塊執(zhí)行外部命令, 并捕獲stdout, stderr的輸出
import subprocess


# print ’popen3:’

def external_cmd(cmd, msg_in=''):
    try:
        proc = subprocess.Popen(cmd,
                                shell=True,
                                stdin=subprocess.PIPE,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE,
                                )
        stdout_value, stderr_value = proc.communicate(msg_in)
        return stdout_value, stderr_value
    except ValueError as err:
        # log("ValueError: %s" % err)
        return None, None
    except IOError as err:
        # log("IOError: %s" % err)
        return None, None


if __name__ == '__main__':
    stdout_val, stderr_val = external_cmd('dir')
    print ('Standard Output: %s' % stdout_val)
    print ('Standard Error: %s' % stderr_val)
  • 得到命令的返回值嘿悬,wait
p=subprocess.Popen("dir", shell=True)  
p.wait()
  • 但是Popen函數(shù)有一個缺陷,就是它是一個阻塞的方法善涨。如果運行cmd時產(chǎn)生的內(nèi)容非常多,函數(shù)非常容易阻塞住钢拧。解決辦法是不使用wait()方法,但是也不能獲得執(zhí)行的返回值了源内。

commands.getstatusoutput

  • 不介意使用,因為在python3中被廢棄
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗽交,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子轮纫,更是在濱河造成了極大的恐慌焚鲜,老刑警劉巖掌唾,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忿磅,死亡現(xiàn)場離奇詭異,居然都是意外死亡葱她,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門搓谆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豪墅,“玉大人泉手,你說我怎么就攤上這事偶器》炜悖” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵憋飞,是天一觀的道長姆吭。 經(jīng)常有香客問我,道長内狸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任答倡,我火速辦了婚禮,結(jié)果婚禮上瘪撇,老公的妹妹穿的比我還像新娘。我一直安慰自己倔既,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布佩谣。 她就那樣靜靜地躺著,像睡著了一般茸俭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上调鬓,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天酌伊,我揣著相機與錄音腾窝,去河邊找鬼居砖。 笑死,一個胖子當著我的面吹牛奏候,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鼻由,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼厚棵,長吁一口氣:“原來是場噩夢啊……” “哼蔼紧!你這毒婦竟也來了狠轻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤向楼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后湖蜕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡昭抒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年灭返,在試婚紗的時候發(fā)現(xiàn)自己被綠了盗迟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熙含。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖怎静,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚓聘,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布导饲,位于F島的核電站氯材,受9級特大地震影響渣锦,放射性物質(zhì)發(fā)生泄漏氢哮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一冗尤、第九天 我趴在偏房一處隱蔽的房頂上張望胀溺。 院中可真熱鬧皆看,春花似錦仓坞、人聲如沸腰吟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至织阅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荔棉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工江耀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诉植,地道東北人祥国。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓晾腔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灼擂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容