2012-07-04 63 views
0

我是一個新的Python編程和編程以及。如果這個聲音是一個基本問題,那麼請原諒。需要更好地進行子進程通信

我正在開發一個工具,它當然會在git上進行清潔和製作。

我正在使用子進程模塊來運行這些make命令。

一個觀察結果是:我使用通信來查看make命令的結果。通信問題是,它等待subprocess.popen完成併發送輸出。

如果make命令運行30分鐘,屏幕上沒有輸出30分鐘,然後通信將整個數據發送到30分鐘。

問題是:有沒有辦法從子進程中獲取輸出,以及何時在stdout上顯示某些內容,然後將其輸出到屏幕上?

,我迄今編寫的代碼是:

def makeClean(path,cmd1='make',cmd2='clean'): 
    print '+++++++++++ RUNNING MAKE CLEAN +++++++++++ \n' 
    c = subprocess.Popen([cmd1 , cmd2],stdout = subprocess.PIPE, stderr = subprocess.PIPE,cwd = path) 
    out = c.communicate()[0] 
    for line in out.split('\r\n'): print line 

對這個有什麼想法?我試着用pexpect.run(),但並沒有爲我工作...

-Vijay

回答

2

如果輸出應該去到stdout,然後不重定向回調用進程。只是

subprocess.call([cmd1, cmd2], cwd=path) 

會做。如果你需要處理以某種方式輸出,那麼就不要使用communicate而是直接從管道中讀取:

proc = subprocess.Popen([cmd1, cmd2], stdout=subprocess.PIPE, cwd=path) 
for ln in proc.stdout: 
    process(ln) 
+0

我的腳本打印腳本日誌到控制檯和一個文件。當我使用subprocess.call時,腳本日誌永遠不會去一個文件..但subprocess.Popen的第二個解決方案爲我工作..感謝您的輸入。 – user596922

+0

另一個快速的問題..我用第二個建議,但在每一行的末尾插入一個新的行..我如何克服它? – user596922

+0

@ user596922:它不插入*換行符,它*保留*原始輸入中的換行符,就像Python的文本IO方法總是這樣做的。你可以調用線條上的'strip'方法來刪除它。 –