2013-10-11 72 views
4

我想在Python腳本執行以下Shell命令:從Python的執行shell腳本有多個管道

dom=myserver  
cat /etc/xen/$myserver.cfg | grep limited | cut -d= -f2 | tr -d \" 

我有這樣的:

dom = myserver 

limit = subprocess.call(["cat /etc/xen/%s.cfg | grep limited | cut -d= -f2", str(dom)]) 
subprocess.call(['/root/bin/xen-limit', str(dom), str(limit)]) 

它不工作,但我不「知道爲什麼..

更新:

c1 = ['cat /etc/xen/%s.cfg'] 
p1 = subprocess.Popen(c1, stdout=subprocess.PIPE) 

c2 = ['grep limited'] 
p2 = subprocess.Popen(c2, stdin=p1.stdout, stdout=subprocess.PIPE) 

c3 = ['cut -d= -f2'] 
p3 = subprocess.Popen(c3, stdin=p2.stdout, stdout=subprocess.PIPE) 

c4 = ['tr -d \"'] 
p4 = subprocess.Popen(c4, stdin=p3.stdout, stdout=subprocess.PIPE) 

result = p4.stdout.read() 

limit = subprocess.call([result]) 
subprocess.call(['/root/bin/xen-limit', str(dom), str(limit)]) 
+0

整個管道可以與單一命令'AWK -F = '/有限/ {打印GSUB( 「\」」, 「」,$ 2)}' 的/ etc/xen的/ $替換myserver.cfg'(必要時替換'$ myserver') – chepner

回答

8

能膠若干子過程一起:

c1 = ['ls'] 
p1 = subprocess.Popen(c1, stdout=subprocess.PIPE) 

c2 = ['wc'] 
p2 = subprocess.Popen(c2, stdin=p1.stdout, 
         stdout=subprocess.PIPE) 

result = p2.stdout.read() 

注意如何,我們已經設置P2的標準輸入是P1的標準輸出。

編輯:簡化了例子

+0

謝謝你的回答! 我上面編輯了我的帖子。 類似的東西? – Vince

1

做了它! :d感謝

dom = myserver  
c1 = ['/bin/cat', '/etc/xen/%s.cfg' % (str(dom))] 
p1 = subprocess.Popen(c1, stdout=subprocess.PIPE) 

c2 = ['grep', 'limited'] 
p2 = subprocess.Popen(c2, stdin=p1.stdout, 
        stdout=subprocess.PIPE) 

c3 = ['cut', '-d=', '-f2'] 
p3 = subprocess.Popen(c3, stdin=p2.stdout, 
        stdout=subprocess.PIPE) 

c4 = ['tr', '-d', '\"'] 
p4 = subprocess.Popen(c4, stdin=p3.stdout, 
        stdout=subprocess.PIPE) 

result = p4.stdout.read() 
subprocess.call(['/root/bin/xen-limit', str(dom), str(result)])