2015-07-10 72 views
8

我想在一個bash會話中同時運行多個python腳本並分別實時檢查它們的輸出。要完成這個任務,我寫了如下一個簡單的bash腳本:在後臺運行程序並將其輸出實時重定向到文件

#!/bin/bash 
python 1.py > 1.output & 
python 2.py > 2.output & 
python 3.py > 3.output & 

當我使用cat 1.output命令檢查什麼已經在執行時,然而,沒有什麼可以看出,中間被打印。

經過一段時間後,我意識到當1.py完成執行時必須填寫1.output。換句話說,我在這裏使用的方法不是real time時尚。

您可能會提醒您等待這些Python腳本的完成。事實上,不幸的是,所有那些python腳本實際上都是長時間運行的程序,它們可能會在幾天或幾個月後完成,這就是爲什麼我要實時檢查它們的輸出。

此外,您可能會建議我修改python腳本以將消息直接打印到文件而不是stdout。對不起,這裏的腳本太複雜,無法修改,其中有print函數。

我現在可以做什麼?

+1

有Python腳本刷新它們的輸出定期... –

+0

後您使用此記錄動作的代碼,請。 –

回答

21

-u交換機和等效的PYTHONUNBUFFERED環境變量強制標準輸出無緩衝。試試這個:

#!/bin/bash 
python -u 1.py > 1.output & 
python -u 2.py > 2.output & 
python -u 3.py > 3.output & 

#!/bin/bash 
export PYTHONUNBUFFERED=yes 
python 1.py > 1.output & 
python 2.py > 2.output & 
python 3.py > 3.output & 

注意-u有副作用:讀取DOC,以瞭解更多信息。

參考:

0

如果你可以在程序中找到某種主循環,這可能是進展的一個很好的指示器,那麼寫入到文件將會很好。如果你說在Python輸出流被關閉之前輸出沒有填充,那麼這可能是最簡單的選擇。

0

您可以嘗試做覆蓋標準錯誤/標準輸出在腳本:

# in the beginning of your script 
import os 
import sys 

desired_output_file = open('/path/to/file', 'a') 
os.dup2(desired_output_file.fileno(), sys.stdout) 
os.dup2(desired_output_file.fileno(), sys.stderr) 

然後,所有print通話將寫信給這個特殊的文件,而不是到stdout。但是,主要問題可能是緩衝IO。你必須以某種方式flush這種文件的內容到磁盤。

相關問題