2011-02-13 50 views
2

我想用python的子進程庫來處理字符串,在不同的程序中處理這個字符串,然後收集並保存它。不幸的是,這個字符串很長(如長達數百萬字符)。所以我有以下代碼段設置:用python子進程管道很長的字符串通過管道

cmd = ['some command'] 
p1 = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT) 
result = p1.communicate(input='some string') 

其中'一些字符串'實際上是數百萬字符長。

,我總是得到這樣的錯誤:

OSError: [Errno 32] Broken pipe 

我已經試過了在更短的字符串和代碼工作,所以我猜我杏的管道緩衝區。

有沒有任何合理的解決方案,而不必訴諸創建臨時文件?

有幾個約束使得使用子進程對我來說是最有吸引力和最簡單的解決方案,這就是爲什麼我想要在python和子進程中的解決方案。

+0

破管也可能意味着子進程死於其他原因。輸入無效或內存不足可能是罪魁禍首。你有沒有嘗試改變命令,像'貓'? – SpliFF 2011-02-13 01:31:32

+0

@SpliFF拍攝。你是對的。我試過貓和tr,他們都很好。所以這是導致問題的其他程序。謝謝!如果您將評論更改爲答案,我很樂意選擇它。或者這是毫無意義的? – JasonMond 2011-02-13 01:42:56

+0

不對我,我追逐10k :) – SpliFF 2011-02-13 01:43:46

回答

4

斷管還可能意味着子過程死於其他原因。輸入無效或內存不足可能是罪魁禍首。你有沒有嘗試改變命令像貓?

0

如果您通過輸入發送數百萬個字符,那麼程序的體系結構顯然是錯誤的。通常在這些情況下,程序會讀入這些輸入的塊。

話雖如此,有可能將文件作爲STDIN用於子流程。這也可能導致大輸入同樣的問題。

也沒有Python/subprocess,你如何將這麼長的輸入傳遞給你的程序?

>>> import subprocess 
>>> fo = open('filewithinput') 
>>> proc = subprocess.Popen(['cat'],stdin=fo,stdout=subprocess.PIPE) 
>>> out,err = proc.communicate() 
>>> fo.close() 
>>> print out