2016-07-14 139 views
0

執行bash命令我想從蟒蛇內執行bash命令,並得到輸出:與管蟒蛇

ifconfig | sed '/^$/d' | awk 'NR > 1 { print $2 }' 

我已經嘗試過:

p =subprocess.Popen(["ifconfig | sed '/^$/d' | awk 'NR > 1 { print $2 }'"], stdout = PIPE.) 
out = p.communicate() 

和將過程分成更小的:

P1和P2和P1通輸出到P2,但是這是不工作

我該怎麼辦?

+0

你是什麼意思'不工作'?你有錯誤信息嗎?輸出不匹配嗎? –

+0

你*要麼*需要使用'shell = True',或者分成更小的東西,並且做對。 –

+0

......如果你不顯示你如何做後者,我們如何判斷你是否做得對? –

回答

2

shell=True是必要的,如果你不打算分成多個子進程本身 - 在這種情況下,你需要一個shell來評估你的命令,將其分解成單獨的管道組件,並啓動這些組件。通常情況下,shell會以這種方式解析一個字符串(您也可以將它傳遞給一個數組,但除第一個條目之外的任何內容都將僅作爲shell的額外參數,在單獨使用時填充$1,$2等作爲第一個數組項通過腳本)報價:

p = subprocess.Popen("ifconfig | sed '/^$/d' | awk 'NR > 1 { print $2 }'", 
        shell=True, stdout=subprocess.PIPE) 

另外,要避免不需要任何外殼可言,您可以連接並自己啓動進程(這其實是首選的方法處理時與不受信任的輸入或安全敏感的情況;根本使用一個外殼可能導致您打開安全漏洞,如Shellshock):

from subprocess import Popen, PIPE 

p1 = Popen(['ifconfig'],         stdout=PIPE) 
p2 = Popen(['sed', '/^$/d'],    stdin=p1.stdout, stdout=PIPE) 
p3 = Popen(['awk', 'NR > 1 { print $2 }'], stdin=p2.stdout, stdout=PIPE) 
stdout, _ = p3.communicate()