我有以下 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
这是怎么回事?我怎样才能让标准输出完全刷新,为什么它出现故障?我尝试过使用traceback.format_exc
,然后手动打印,但我得到了相同的结果。打电话sys.stderr.flush
也不能解决任何问题。我也尝试过在循环中休眠以查看是否有帮助,但没有任何帮助。
更新
我看到的一个有趣的行为:如果我ctrl+c
这样做,通常程序会继续运行 - try/except 只是捕获KeyboardInterrupt
并继续循环。但是,如果我ctr+c
在发送错误后它会退出,我会得到以下信息。这几乎就像它在内部暂停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