2013-04-09 90 views
0

傳達我有這樣的代碼用Python子進程

p.stdin.write('alloc ' + str(size) + '\n' + chr(0x1a)) 
p.stdin.flush() 
stdout = p.stdout.readline() 

的問題是,劇本一直掛在的ReadLine()

如果我更換

p.stdin.flush() 

p.stdin.close() 

它的工作原理,但不允許我繼續與進程溝通

我應該怎麼做才能將數據發送到標準輸入並從標準輸出讀取回復,並且仍然能夠在腳本中重複該操作?

+0

子進程可能使用緩衝輸出,除非您告訴我們它是什麼,否則我們不能說是否有辦法使其無緩衝。 – msw 2013-04-09 15:24:18

+0

Python 2或Python 3? – cdarke 2013-04-09 15:26:40

+0

這是一個簡單的c程序,用 fgets(line,MAX_LINE_LENGTH,stdin)讀取; – mOnAr 2013-04-09 15:26:43

回答

0

並且子過程使用fprintf(stdout,「%d \ n」,my_alloc(data))寫入;

就像你在父進程做了,你就必須在fflush(stdout)fprintf()的孩子,因爲stdio庫將緩衝輸出(通常要等到有等待寫BUFSIZ字節)。

您可能會看到,當您從shell運行孩子時,它看起來像是在每個換行符上輸出輸出。這是因爲stdio庫在連接到終端時會設置行緩衝。它連接到管道時不這樣做。有關詳細信息,請參閱isatty(3)setbuf(3)

你在Python方面做得很對,現在你必須在管道的C端做同樣的事情。 Python readline被阻塞,因爲孩子尚未向管道發送任何東西。