Python无法在无缓冲模式下工作

时间:2017-11-07 14:14:06

标签: python stdout stderr buffering unbuffered

我在使用python时遇到了问题。我在Red Hat Enterprise Linux Server 7.1(Maipo)上使用了Python 2.7.13和Python 3.6.0。为了监视proccesses输出,我想使用tail -f来实时查看STDOUT和STDERR。这里的关键字是无缓冲输出。互联网上的许多建议都说使用python -u ...或环境变量PYTHONUNBUFFERED,如PYTHONUNBUFFERED=1 python ...stdbuf -e0 -o0 python ...。然而,下面的测试脚本没有任何内容。

import sys
import time
while(True):
   print("Test String")
   time.sleep(1);

对于所有不同的命令,我总是有缓冲输出。即使我想使用STDERR。它仍然是缓冲的,这让我很困惑,因为默认情况下STDERR应该是无缓冲的。使用sys.stdout.flush()sys.stderr.flush()也无法胜任。在flush=True内使用print()时,它按预期工作。

我正在寻找一种不需要编辑代码的解决方案,因为我无法编辑所有程序以获得无缓冲并立即刷新输出。我怎样才能做到这一点?

期待您的回答!

祝福!

1 个答案:

答案 0 :(得分:3)

您可以在Python 3中覆盖print()函数。这样您就不需要更改脚本中的每个print()函数。

import builtins


def print(*args):
    builtins.print(*args, sep=' ', end='\n', file=None, flush=True)


print(
    'hello', 'world',
    'I have overrode print() function!',
    1,  # integer
    [1, 2],  # list
    {1, 2},  # set
    (1, 2),  # tuple
    {1: 2}  # dict
)

将打印:

hello world I have overrode print() function! 1 [1, 2] {1, 2} (1, 2) {1: 2}