2013-03-12 66 views
0

我使用下面的subprocesss讀取從相當大的文件行(4的Arnd GB)如何從遍歷Subprocess.Popen標準輸出的循環中斷開?

p1=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) 
p=subprocess.Popen(gawk_exp, shell=True, stdin=p1.stdout, stdout=subprocess.PIPE) 

其中cmd = zgrep 「文本搜索」 filename.gz

gawk_exp只是另一個GAWK表達式從grepped行過濾。

,然後在p迭代如下:

for line in iter(p.stdout.readline, ''): 
    .. 
    .. 
    .. 
    if(success): 
     break 

這導致的 「grep:寫入輸出:破碎管」 錯誤。

但是我想早點退出for循環,如果它滿足一定的條件。

我已經試過許多途徑一樣,

if(success): 
    os.kill(p.pid, signal.SIGKILL) 
    os.kill(p1.pid, signal.SIGKILL) 
    OR 
    subprocess.Popen.kill(p1.pid, p.pid) 
    subprocess.Popen.kill(p.pid) 
    OR 
    p1.stdout.close() 
    p.stdout.close() 
在不同的順序

,但無濟於事。

任何提示我如何優雅地擺脫循環?

版本的詳細信息: 的Python 2.4.3(#1,2009年6月11日,14時09分37秒) [GCC 4.1.2 20080704(紅帽4.1.2-44)上linux2上

回答

0

你可以設置stderr作爲zgrep作業,捕獲它,並且只在其他地方檢測到錯誤(例如,如果您從未在循環中提前退出時)打印它寫入的內容。

或者停止使用Popen運行zgrep,並開始使用Python zlib直:http://docs.python.org/2/library/zlib.html - 我個人倒試試這個,其次是可能實現整個事情在Python,而不是使用gawk

0

我不直接在這裏回答你的問題,但我只是指出,對於這些類型的任務plumbum是非常有用的。用它代替popen等,會讓你的生活變得如此簡單。

+0

感謝您的鏈接。不幸的是我不能使用它,因爲我必須使用2.4.3。 – Aymer 2013-03-14 06:00:18