調(diào)用外部進(jìn)程的幾種方法

在 Python 中調(diào)用外部進(jìn)程是很常見的需求,以下為幾種常見的方法谴仙。

os.system

這個方法實際上調(diào)用的是系統(tǒng)的 C 函數(shù) system(), 命令以字符串的形式傳入篱瞎,在系統(tǒng)子 shell 中執(zhí)行,和在真實的 shell 執(zhí)行一致堰乔。

優(yōu)點:可以利用 shell 的管道和重定向等特性來實現(xiàn)比較復(fù)雜的命令秀撇。

import os

# 使用管道獲取所有java進(jìn)程并強(qiáng)制殺掉
os.system('ps -ef|grep java|cut -c 9-15|xargs kill -9')

# 獲取當(dāng)前目錄下所有png圖片文件名并重定向到png_list.txt中
os.system('ls *.png > png_list.txt')

缺點:外部進(jìn)程的輸出無法被 python 代碼捕獲,system 函數(shù)只返回一個 exit status舍肠,此外作為命令傳入的字符串必須是有效的命令搀继,否則會出現(xiàn)意想不到的結(jié)果。

os.popen

與上一種不同的是貌夕,os.popen 會開辟一個管道并將輸出通過一個 file-like 的對象返回給調(diào)用者律歼,類似 python 中文件操作方法 open 一樣。

import os

with os.popen('ls *.png', mode='r') as res:
    result = res.read()

subprocess.Popen

這個是 python 自帶庫 subprocess 中的 Popen 類啡专,作為 os.popen 的替代险毁,擁有更多可選參數(shù)。

import subprocess

# 當(dāng) shell=True 時们童,POSIX 類系統(tǒng)默認(rèn)會調(diào)用 /bin/sh 來執(zhí)行傳入的命令
result = subprocess.Popen(['ls', '-l'], shell=True, stdout=subprocess.PIPE).stdout.read()

subprocess.call

這個函數(shù)擁有類似 Popen 類的可選參數(shù)畔况,但是會等待子進(jìn)程運(yùn)行完畢再返回一個返回碼。

import subprocess

return_code = subprocess.call(['ls', '-l'], shell=True)

subprocess.run

這個函數(shù)在 python3.5 及以后的版本可用慧库,有幾個非常有用的參數(shù)可選跷跪,該函數(shù)返回的是一個 CompletedProcess 對象,通過該對象可以獲取標(biāo)準(zhǔn)輸入和輸出齐板。

import subprocess

# 在shell中執(zhí)行并獲取標(biāo)準(zhǔn)輸出和錯誤
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 可以配合 shlex 庫分割指令字符串
# subprocess.run(shlex.split('ls -l))
print(result.stdout)
print(result.stderr)

# 對返回值進(jìn)行檢查, 如果子程序返回錯誤那么拋出一個CalledProcessError的異常
result = subprocess.run(['ls', '-l'],check=True)

# 給子程序加上超時限制, 如果超時, 向上拋出TimeoutExpired異常, 在項目中控制外部進(jìn)程用時是比較好的習(xí)慣
result = subprocess.run(['sleep', '5'], timeout=3)

fabric.operations

from fabric import operations

res = operations.local('ls -l', capture=True)

# 在遠(yuǎn)程服務(wù)器上執(zhí)行命令吵瞻,但需要提前配置好登陸信息
res = operations.run('cmd')

第三方模塊 sh

其通過動態(tài)解析 $PATH 來執(zhí)行二進(jìn)制命令,執(zhí)行并不是 Python 類或函數(shù)甘磨,而是用 python 包裝了系統(tǒng) PATH 中的可執(zhí)行命令橡羞,也就是說系統(tǒng)路徑中所有命令都是可以執(zhí)行的。

# 安裝
pip install sh

# 執(zhí)行各種系統(tǒng)命令
sh.ls('-l', '/data')
sh.ifconfig()

# 使用管道济舆,并獲取返回值
count = sh.wc(sh.ls('-l'), '-l')

# 甚至可以使用子命令
sh.git.status()

# 將命令放在后臺運(yùn)行
p = sh.find('-name', 'sh.py', _bg=True)
# 干其他事
p.wait()

總結(jié)

個人優(yōu)先推薦官方庫中的 subprocess 模塊中的 run 函數(shù)卿泽,簡單易用。

參考

Python調(diào)用外部進(jìn)程的幾種方法 - 安陽的文章 - 知乎

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滋觉,一起剝皮案震驚了整個濱河市签夭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椎侠,老刑警劉巖第租,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異我纪,居然都是意外死亡慎宾,警方通過查閱死者的電腦和手機(jī)儡羔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來璧诵,“玉大人,你說我怎么就攤上這事仇冯≈蓿” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵苛坚,是天一觀的道長比被。 經(jīng)常有香客問我,道長泼舱,這世上最難降的妖魔是什么等缀? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮娇昙,結(jié)果婚禮上尺迂,老公的妹妹穿的比我還像新娘。我一直安慰自己冒掌,他們只是感情好噪裕,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著股毫,像睡著了一般膳音。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铃诬,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天祭陷,我揣著相機(jī)與錄音,去河邊找鬼趣席。 笑死兵志,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吩坝。 我是一名探鬼主播毒姨,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钉寝!你這毒婦竟也來了弧呐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嵌纲,失蹤者是張志新(化名)和其女友劉穎俘枫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逮走,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸠蚪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(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
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留砂碉,地道東北人蛀蜜。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像增蹭,于是被迫代替她去往敵國和親滴某。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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