为了账号安全,请及时绑定邮箱和手机立即绑定

如何冲洗输出的打印功能?

如何冲洗输出的打印功能?

交互式爱情 2019-05-31 11:08:21
如何冲洗输出的打印功能?如何强制Python的打印函数输出到屏幕上?这不是禁用输出缓冲-联系的问题是尝试无缓冲的产出,而这是比较普遍的问题。这个问题中最重要的答案对于这个问题来说过于强大或牵扯(对于这个问题它们不是很好的答案),这个问题可以通过一个相对的新手在Google上找到。
查看完整描述

4 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

import sys
sys.stdout.flush()

print默认情况下打印到sys.stdout.

参考文献

Python 2

  • 这个print陈述

  • sys.stdout

  • 文件对象

Python 3

  • print()

  • sys.stdout

  • 文件对象-词汇表

  • io.IOBase.flush() (sys.stdout

    继承

    flush

    io.IOBase)


查看完整回答
反对 回复 2019-05-31
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

跑动python -h,我看到一个命令行选项:

-u:未缓冲的二进制标准输出和stderr;还有PYTHONBUFFERED=x

查看完整回答
反对 回复 2019-05-31
?
郎朗坤

TA贡献1921条经验 获得超9个赞

从Python3.3开始,您可以强制使用普通的print()函数不需要使用就可以进行刷新。sys.stdout.flush();只需将“刷新”关键字参数设置为true。

打印(*Object,Sep=‘,end=’\n‘,file=sys.stdout,刷新=false)

将对象打印到流文件,然后用SEP分隔,然后再输出End。如果存在,则必须将SEP、End和file作为关键字参数。

所有非关键字参数都被转换为字符串,如str()所做的,并将其写入流中,然后用SEP分隔,后面跟着End。SEP和End都必须是字符串;它们也可以是None,这意味着使用默认值。如果没有给出对象,print()将只写End。

文件参数必须是带有写(字符串)方法的对象;如果它不存在或不存在,则将使用sys.stdout。输出是否缓冲通常由文件决定,但如果FLUSH关键字参数为真,则强制刷新流。


查看完整回答
反对 回复 2019-05-31
?
12345678_0001

TA贡献1802条经验 获得超5个赞

如何冲洗Python打印输出?

我建议采取五种方法:

  • 在Python 3中,调用

    print(..., flush=True)

    (Python2的print函数中不能使用刷新参数,并且没有打印语句的模拟)。
  • 打电话

    file.flush()

    例如,在输出文件(我们可以包装python 2的打印函数)上,

    sys.stdout

  • 将此应用于模块中每个带有部分函数的打印函数调用,


    print = partial(print, flush=True)

    应用于模块全局。
  • 将其应用于带有标志的进程(

    -u

    )传递给解释器命令
  • 将此应用于您环境中的每个python进程。

    PYTHONUNBUFFERED=TRUE

    (并取消设置变量以撤消此操作)。

Python 3.3+

使用Python3.3或更高版本,您只需提供flush=True作为关键字参数。print职能:

print('foo', flush=True)

Python 2(或<3.3)

他们没有支持flush参数设置为Python2.7,因此如果您使用Python 2(或小于3.3),并且希望代码与2和3兼容,那么我可以建议使用以下兼容性代码。(注意__future__导入必须在/非常“靠近模块顶部"):

from __future__ import print_functionimport sysif 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()

上述兼容性代码将涵盖大多数用途,但为了进行更彻底的处理,six模块.

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

import sysprint 'delayed output'sys.stdout.flush()

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

可以通过在模块的全局范围上使用Functiontools.分部来更改打印函数的默认值:

import functoolsprint = functools.partial(print, flush=True)

如果您看一下我们的新的分部函数,至少在Python 3中是这样的:

>>> print = functools.partial(print, flush=True)>>> printfunctools.partial(<built-in function print>, flush=True)

我们可以看到它的工作和正常一样:

>>> print('foo')foo

我们实际上可以覆盖新的默认设置:

>>> print('foo', flush=False)foo

请再次注意,这只会更改当前全局范围,因为当前全局作用域上的打印名称将覆盖内建物。print函数(如果使用Python 2,则在当前全局范围内取消兼容性函数)。

如果您想在一个函数中而不是在一个模块的全局范围内这样做,您应该给它一个不同的名称,例如:

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

如果在函数中声明它是全局的,那么就在模块的全局命名空间上更改它,所以应该将它放在全局命名空间中,除非特定的行为正是您所希望的。

更改进程的默认值

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

$ python -u script.py

$ python -um package.module

博士:

强迫stdin、stdout和stderr完全不缓冲。在重要的系统上,也将stdin、stdout和stderr放在二进制模式中。

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

更改shell操作环境的默认值

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

例如,在Linux或OSX中:

$ export PYTHONUNBUFFERED=TRUE

或Windows:

C:\SET PYTHONUNBUFFERED=TRUE

博士:

平底

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


增编

下面是Python2.7.12中打印函数的帮助-注意 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.


查看完整回答
反对 回复 2019-05-31
  • 4 回答
  • 0 关注
  • 544 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信