subprocess模塊

subprocess也是一個(gè)常用的模塊补胚,目前工作所涉及的都比較淺蒂教,所以這里只列出一些基本用法和注意點(diǎn)(只適用*nix系統(tǒng))。以后用到advanced的內(nèi)容畴嘶,會(huì)更新此文章蛋逾。refer to: python DOC

定義:

spawn新的進(jìn)程,連接input/output/error管道窗悯,并獲取錯(cuò)誤碼区匣。
以下模塊不建議繼續(xù)使用,而用subprocess取代:

os.system
os.spawn*
os.popen*
popen2.*
commands.*

subprocess確實(shí)是更加強(qiáng)大蒋院,而且以前的模塊有時(shí)候會(huì)有bug亏钩。

用法:
  • call:
import subprocess
subprocess.call(["ls", "-l"])
subprocess.call("exit 1", shell=True)

如果只需要獲取子進(jìn)程的錯(cuò)誤碼,這個(gè)方法就足夠了欺旧,而且非常好用姑丑。
可以看到它有兩種用法,doc里推薦第一種辞友,就是傳一個(gè)字符串list(把cmd split成為一個(gè)list)栅哀。第二種呢是直接傳一個(gè)字符串cmd,并把參數(shù)shell賦值為true称龙。
如果用第一種的話留拾,有個(gè)模塊shlex,可以把cmd分解成list茵瀑,并很好的處理空格和引號(hào)间驮。cmd復(fù)雜的話建議這么使用,不會(huì)出錯(cuò)马昨。

import shlex
command_line = raw_input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
args = shlex.split(command_line)
print args
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]

第二種用法簡(jiǎn)單易懂竞帽,就不說(shuō)了扛施。看似兩種方法都可以屹篓,但這里有個(gè)很大的坑:
如果cmd里有管道符疙渣,一定要用第二種,否則exit code會(huì)不準(zhǔn)堆巧。
具體原因我還沒(méi)細(xì)看妄荔,童鞋們有精力可以深入研究一下。就是因?yàn)檫@個(gè)坑才讓我重新學(xué)習(xí)這個(gè)模塊谍肤,也就有了這篇blog...

  • check_call和check_output:

check_call和call用法基本一樣啦租,唯一的不同點(diǎn)是如果exit code非零,check_call會(huì)raise一個(gè)CalledProcessError荒揣。
check_output也是一樣的道理篷角,非零會(huì)raise一個(gè)CalledProcessError。但它return的是output系任。它還有個(gè)屬性returncode來(lái)獲取退出碼恳蹲。

  • Popen:

最common的方法,可以操作input/output/error管道俩滥,并獲得exit code嘉蕾。
Popen和前面的方法有個(gè)很大的不同點(diǎn)是, process會(huì)丟在后臺(tái)運(yùn)行。 而call等方法會(huì)等到proccess運(yùn)行結(jié)束才返回霜旧。在使用的時(shí)候要多加注意错忱。
我用一段代碼來(lái)說(shuō)明其用法:

import shlex
from subprocess import Popen, PIPE
def get_exitcode_stdout_stderr(cmd):
    """
    Execute the external command and get its exitcode, stdout and stderr.
    """
    args = shlex.split(cmd)
    proc = Popen(args, stdout=PIPE, stderr=PIPE)
    out, err = proc.communicate()
    exitcode = proc.returncode
    return exitcode, out, err
cmd = "..."  # arbitrary external command, e.g. "python mytest.py"
exitcode, out, err = get_exitcode_stdout_stderr(cmd)

應(yīng)該很容易看懂吧。
That's it.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挂据,一起剝皮案震驚了整個(gè)濱河市航背,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棱貌,老刑警劉巖玖媚,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異婚脱,居然都是意外死亡今魔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門障贸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)错森,“玉大人,你說(shuō)我怎么就攤上這事篮洁∩” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瓦阐。 經(jīng)常有香客問(wèn)我蜗侈,道長(zhǎng),這世上最難降的妖魔是什么睡蟋? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任踏幻,我火速辦了婚禮,結(jié)果婚禮上戳杀,老公的妹妹穿的比我還像新娘该面。我一直安慰自己,他們只是感情好信卡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布隔缀。 她就那樣靜靜地躺著,像睡著了一般傍菇。 火紅的嫁衣襯著肌膚如雪蚕泽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天桥嗤,我揣著相機(jī)與錄音,去河邊找鬼仔蝌。 笑死泛领,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敛惊。 我是一名探鬼主播渊鞋,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瞧挤!你這毒婦竟也來(lái)了锡宋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤特恬,失蹤者是張志新(化名)和其女友劉穎执俩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體癌刽,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡役首,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了显拜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衡奥。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖远荠,靈堂內(nèi)的尸體忽然破棺而出矮固,到底是詐尸還是另有隱情,我是刑警寧澤譬淳,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布档址,位于F島的核電站盹兢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辰晕。R本人自食惡果不足惜蛤迎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望含友。 院中可真熱鬧替裆,春花似錦、人聲如沸窘问。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惠赫。三九已至把鉴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間儿咱,已是汗流浹背庭砍。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留混埠,地道東北人怠缸。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钳宪,于是被迫代替她去往敵國(guó)和親揭北。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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