2013-07-29 81 views
0

我試圖讓下面的shell命令的輸出在我的python腳本,蟒蛇subprocess.Popen VS os.popen

hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'} 

我能順利通過os.popen得到的輸出如下:

import os 
cmd = "hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}" 
p = os.popen(cmd,"r") 
while 1: 
    line = p.readline() 
    if not line: break 
    print line 

os.popen()自python 2.6以來已棄用,所以我想用subprocess.Popen()函數替換上面的代碼片段。

但是,下面的subprocess.Popen()的代碼片段給出了與上面的代碼片段不同的結果。

import subprocess as sub 
import shlex 
cmd = "hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}" 
args = shlex.split(cmd) 
p = sub.Popen(args,stdout=sub.PIPE,stderr=sub.PIPE) 
output, errors = p.communicate() 
print output 

以上命令只給出了'hadoop fs -ls /projectpath/'部分命令的輸出。 我曾嘗試諮詢subpocess.Popen()的幾個參考文獻(http://docs.python.org/2/library/subprocess.html#popen-objectsPython, os.system for command-line call (linux) not returning what it should?),但無法讓它在字符串cmd中執行命令。任何人都可以指出我做錯了什麼?

回答

2

試試這個:

cmd = "hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}" 
p = sub.Popen(cmd,stdout=sub.PIPE,stderr=sub.PIPE, shell=True) 
+0

作品。謝謝。 – rohanag