2012-06-11 76 views
0

由於inputraw_input()停止運行程序了,我想用一個子進程來運行這個程序......如何在PYTHON中使用子進程實現流輸入?

while True: print raw_input() 

,並得到其輸出。

這是我爲我的閱讀計劃:

import subprocess 
process = subprocess.Popen('python subinput.py', stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
while True: 
    output=process.stdout.read(12) 
    if output=='' and process.poll()!=None: 
     break 
    if output!='': 
     sys.stdout.write(output) 
     sys.stdout.flush() 

當我運行此,子進程退出幾乎一樣快,因爲它開始。我怎樣才能解決這個問題?

+0

什麼是'subinput.py'的照顧? – nhahtdh

+0

也許你只需要使用標準管道? 「$ python subinput.py | python otherscript.py」。您可以使用fileinput模塊處理stdin輸入。但是,如果你已經有了subinput.py,爲什麼不直接導入並作爲普通函數調用? – monkut

+0

@monkut:raw_input()塊,也就是說,它會停止程序,直到它收到輸入 – beary605

回答

1

恐怕它不會以這種方式工作。

您假定,subprocess將附加您的控制檯(您的特殊 案件stdin)。這不起作用,該模塊只有兩個 選項用於指定:PIPESTDOUT

當沒有指定任何內容時,子流程將無法使用 對應的流 - 它的輸出將無法使用,或者 不會接收任何輸入。由於EOF,raw_input()結束。

要走的路是讓你輸入「主」計劃, 和子進程所做的工作。

編輯:

下面是multiprocessing

from multiprocessing import Process, Pipe 
import time 

def child(conn): 
    while True: 
     print "Processing..." 
     time.sleep(1) 
     if conn.poll(0): 
      output = conn.recv() 
      print output 
     else: 
      print "I got nothing this time" 

def parent(): 
    parent_conn, child_conn = Pipe() 
    p = Process(target=child, args=(child_conn,)) 
    p.start() 
    while True: 
     data = raw_input() 
     parent_conn.send(data) 
    # p.join() - you have to find some way to stop all this... 
    # like a specific message to quit etc. 


if __name__ == '__main__': 
    parent() 

的例子當然,你需要使它更健壯找到一個方式太停止 這種合作。在我的示例中,兩個進程都位於同一個文件中,但您可以按不同方式組織它。

這個例子可以在Linux,你可以在Windows上, 一些問題的管道,但它應該是完全可以解決的。

的「處理」是你想要做別的事情,而不只是 等待從父數據的一部分。

+0

我如何將來自主程序的輸入發送到我的子過程? – beary605

+0

我編輯了我的答案以顯示一個簡單的例子。你也可以看看multiprocessing.Queue的更高層次的通信機制,通知隊列的某些「任務」已經完成。 –

1

我認爲問題是子過程不直接連接到stdoutstdin,因此無法接收鍵盤輸入。據推測raw_input()拋出一個異常。

如果這是一個實際的問題,而不是一個實驗,我推薦你使用一個庫如詛咒或pygame的處理你的輸入。如果你正在做實驗並且想自己做,那麼我想你必須看看線程而不是子進程,儘管這是一件相當複雜的事情,但是你肯定會遇到其他問題。

0

好吧,嘗試不同的架構。您可以使用zeromq

  1. 生產者生產的所有(其通過標準輸出被送到這裏輸出),並通過廣播zmq的項目。

  2. 消費者應該聽製作人正在播放的端口號,並相應地處理它們。

下面是實施例http://code.saghul.net/implementing-a-pubsub-based-application-with

Note

使用geventmultiprocessing產卵這些過程。

您將有master程序來通過產卵producerconsumer