後,我有以下Python代碼:標準輸出將不刷新異常
import sys
import traceback
fifo_in = sys.argv[1]
while 1:
try:
exec open(fifo_in)
except:
traceback.print_exc()
sys.stdout.flush()
第一個參數是由mkfifo
創建命名管道。所以下面打印'1':
mkfifo input
python script.py input
... in a separate terminal ...
echo "print 1" > input
很好,迄今爲止很好。但是當我執行類似echo "foobar" > input
的操作時,該腳本僅打印部分的回溯。然後暫停,直到我發送另一個命令,並且輸出混合起來:
echo "asdf" > input # pause here and check output
echo "print 1" > input
... in output terminal ...
Traceback (most recent call last):
File "test.py", line 8, in <module>
exec open(fifo_in)
File "in", line 1, in <module>
...PAUSES HERE...
print 1
NameError: name 'asdf' is not defined
發生了什麼事?我怎樣才能讓stdout完全沖洗,爲什麼它沒有秩序?我試過用traceback.format_exc
來代替,然後手工打印,但是我得到了相同的結果。調用sys.stderr.flush
也不能解決任何問題。我也嘗試在循環中進行睡眠,看看是否有幫助,但沒有。
UPDATE
一個有趣的一件行爲我看到的:如果我ctrl+c
它,正常程序繼續運行 - 在try /除了剛剛捕獲KeyboardInterrupt
並不斷循環。但是,如果我在發送錯誤後發現它,程序退出,我得到以下信息。這幾乎就像是暫停的print_exc
內:
^CTraceback (most recent call last):
File "test.py", line 10, in <module>
traceback.print_exc()
File "/usr/lib/python2.7/traceback.py", line 232, in print_exc
print_exception(etype, value, tb, limit, file)
File "/usr/lib/python2.7/traceback.py", line 125, in print_exception
print_tb(tb, limit, file)
File "/usr/lib/python2.7/traceback.py", line 69, in print_tb
line = linecache.getline(filename, lineno, f.f_globals)
File "/usr/lib/python2.7/linecache.py", line 14, in getline
lines = getlines(filename, module_globals)
File "/usr/lib/python2.7/linecache.py", line 40, in getlines
return updatecache(filename, module_globals)
File "/usr/lib/python2.7/linecache.py", line 132, in updatecache
with open(fullname, 'rU') as fp:
KeyboardInterrupt
難道你不想在你的除了塊的沖洗? – 2013-02-11 19:50:28
@HunterMcMillen無論代碼採用什麼路徑,我都希望它能夠刷新。在except塊內放置第二次沖洗似乎沒有幫助。 – 2013-02-11 19:52:41
這可能值得在'finally'塊中用'flush'調用來嘗試。我不確定它是否適用於這種特殊情況,但我認爲這種情況是「終於」存在的原因之一。 – bernie 2013-02-11 19:55:11