2015-06-03 64 views
1

我寫一個程序,兩個程序通信:POPEN掛在溝通

output = Popen(shlex.split(query_cmd), stdout=PIPE,stdin=None) 
cmd_out = [output.stdout] 
while cmd_out: 
readable,writeready,exceptready = select.select(cmd_out,[],[],timeout) 
for f in readable: 
    line = f.readline() 
    snap_result=Popen(shlex.split("snap %s" % (line)),stdout=PIPE,close_fds=True).communicate()[0] 
    print snap_result 

據稱query_cmd將不斷產生結果的線。 snap應該使用這一行作爲參數,返回結果並終止。這適用於python2.4。但是,在python2.6.6上,看起來snap會在讀取結果時掛起。 如果我將query_cmd更改爲「tail -f file」。它似乎也起作用。

我在一個csh腳本中運行這個腳本,其中stdout/stderr都被重定向到一個日誌文件。

編輯:其實,它是奇怪的,在csh中,我重定向stdout stdout & stderr到日誌文件。如果我只重定向標準輸出,它運行良好。如果我重定向stderr,它會掛起。我認爲stderr會在python的父進程和子進程之間搞砸。

+0

如果您註釋掉'snap_result ='和跟隨行,但是隻是打印出行,會發生什麼? – deets

+0

如果我發表評論,它會工作,它只會打印出行 –

+0

如果你刪除close_fds會發生什麼?如果用例如「snap」代替「snap」,會發生什麼? 「回聲」? – deets

回答

0

似乎不是腳本的問題,而是因爲子進程期待stdin輸入。將stdin重定向到null設備解決此問題。