如何强制 Python 的print函数将缓冲的输出刷新到屏幕?

Python print flush

Python 3.3+

在 Python 3.3 或更高版本中,支持把flush=True作为print函数的参数:

print('foo', flush=True) Code language: PHP (php)

Python 2(或 < 3.3)

如果是 Python 2(或低于 3.3),并且想要与 2 和 3 兼容的代码,建议使用以下兼容性代码。(注意导入__future__必须非常靠近模块顶部):

from __future__ import print_function
import sys

if sys.version_info[:2] < (3, 3):
    old_print = print
    def print(*args, **kwargs):
        flush = kwargs.pop('flush', False)
        old_print(*args, **kwargs)
        if flush:
            file = kwargs.get('file', sys.stdout)
            # Why might file=None? IDK, but it works for print(i, file=None)
            file.flush() if file is not None else sys.stdout.flush()Code language: PHP (php)

或者,可以在打印后调用file.flush(),例如,使用 Python 2 中的 print 语句:

import sys
print 'delayed output'
sys.stdout.flush()Code language: JavaScript (javascript)

将一个模块中的默认值更改为flush=True

可以通过在模块的全局范围内使用 functools.partial 来更改打印功能的默认值:

import functools
print = functools.partial(print, flush=True)Code language: PHP (php)

注意,这只会更改当前全局范围,因为当前全局范围上的打印名称将遮盖内置print函数(或取消引用兼容性函数,如果在 Python 2 中使用,则在当前全局范围内)。

如果想在函数内部而不是在模块的全局范围内执行此操作,则需要给它一个不同的名称,例如:

def foo():
    printf = functools.partial(print, flush=True)
    printf('print stuff like this')Code language: PHP (php)

如果在函数中声明它是全局的,就是在模块的全局命名空间中改变它,所以你应该把它放在全局命名空间中,除非那个特定的行为正是你想要的。

更改进程的默认值

我认为这里最好的选择是使用-u标志来获得无缓冲的输出。

$ python -u script.py

或者

$ python -um package.module

强制标准输入、标准输出和标准错误完全无缓冲。在重要的系统上,还将标准输入、标准输出和标准错误置于二进制模式。

请注意,file.readlines() 和文件对象(用于 sys.stdin 中的行)中有内部缓冲,不受此选项的影响。要解决这个问题,需要在 while 1: 循环中使用 file.readline()

更改 shell 操作环境的默认值

如果将环境变量设置为非空字符串,则可以为环境中的所有 python 进程从环境继承的环境获取此行为:

例如,在 Linux 或 OSX 中:

$ export PYTHONUNBUFFERED=TRUECode language: JavaScript (javascript)

或Windows:

C:\SET PYTHONUNBUFFERED=TRUECode language: PHP (php)

如果将其设置为非空字符串,则等效于指定 -u 选项。

附录

这是 Python 2.7.12 中有关 print 函数的帮助 – 请注意,没有 flush参数:

>>> from __future__ import print_function
>>> help(print)
print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout)

    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file: a file-like object (stream); defaults to the current sys.stdout.
    sep:  string inserted between values, default a space.
    end:  string appended after the last value, default a newline.Code language: JavaScript (javascript)

发表评论