事實上,你什麼都看不到,可能與緩衝發生的事實有關。所以你只能得到每4克文本左右的輸出。
相反,嘗試這樣的事:
class OutputSplitter(object):
def __init__(self, real_output, *open_files):
self.__stdout = real_output
self.__fds = open_files
self.encoding = real_output.encoding
def write(self, string):
self.__stdout.write(string) # don't catch exception on that one.
self.__stdout.flush()
for fd in self.__fds:
try:
fd.write(string)
fd.flush()
except IOError:
pass # do what you want here.
def flush(self):
pass # already flushed
然後裝飾sys.stdout的與該類一些代碼這樣的:
stdout_saved = sys.stdout
logfile = open("log.txt","a") # check exception on that one.
sys.stdout = OutputSplitter(stdout_saved, logfile)
這樣,每次輸出(包括print
)被刷新到標準輸出和指定的文件。可能需要調整,因爲我沒有測試過這個實現。
當然,打印消息時會期望看到(大部分時間很小)的性能損失。
不要忘記了''stderr''流重定向到''stdout''如果你也想捕捉: ''python -u MyLongRunngingScript.py 2>&1 | tee log.txt'' – stephenfin 2013-12-11 10:54:44