2012-07-15 70 views
0

我知道類似的問題發佈在這裏,但我無法讓我的代碼工作。 我想管一個python程序輸出到其他的輸入。正在等待輸入一個人的raw_input( '>')管道兩個python程序

我試圖運行的代碼是:

import subprocess 
gen = subprocess.Popen(['python', 'first.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
start = subprocess.Popen(['python','second.py'], stdin=gen.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
start.communicate() 

first.py:

try: 
    while(1): 
     print gen() 
     time.sleep(1) 
except KeyboardInterrupt: 
    sys.exit(1) 

輸出沒有按」 t生產任何東西

任何建議?

+0

這解釋了行爲http://bugs.python.org/issue1191964 我想改變我的fist.py程序只返回一個單一的值和second.py來每次調用它。 它可以完成與suboricess? – gizmo 2012-07-15 10:11:20

+0

我做了一個黑客,它給出了正確的輸入,但不知道這是否是一個好方法來解決問題 http://pastebin.com/PwUtNpxa 和t3.py: http://pastebin.com/K3JdYa13 – gizmo 2012-07-15 17:01:51

+0

我做了一個黑客,它給出了正確的輸入,但不知道這是否是一個好方法來解決問題 http://pastebin.com/PwUtNpxa 和t3.py: http://pastebin.com/K3JdYa13 唯一的問題是,它的輸出一個額外>> – gizmo 2012-07-15 17:15:41

回答

0

你的完整second.py是什麼樣的?即使它應該與raw_input()一起工作,你是否嘗試從sys.stdin中讀取?你顯示的代碼片段看起來很好,因爲它爲我工作。

另一個可能的問題可能是您的first.py在程序繼續執行時永遠無法完成。除非第一個子程序命令完成,否則第二個子程序命令將不會執行。因此,請在沒有無限循環的情況下嘗試first.py。讓它停下來,然後嘗試,也許你的管道將工作。

+0

嘗試: 而(1): 字的raw_input =( '>') 結果=拼寫檢查(字) 如果結果: 打印結果 其他: 打印「沒有建議」 除了一個KeyboardInterrupt: sys.exit(1) – gizmo 2012-07-15 10:25:29

+0

和是它的工作原理沒有環在first.py – gizmo 2012-07-15 10:26:18

+1

好了,所以它看起來像你想first.py要產生一些輸出,你想第二.py使用它作爲first.py生成一些輸出。你希望它永遠消失。那麼,據我所知,這對於流水線來說是不可能的,因爲流水線的工作原理是第二個命令只在第一個命令完全執行時執行。在你的情況下,first.py根本沒有完成。爲了實現你想要的,最簡單的解決方案將是TCP套接字,其中一個進程向另一個進程發送數據,另一個只在接收到任何數據時才工作。 – vaidik 2012-07-15 10:35:35