为什么这些print()调用似乎以错误的顺序执行?

2024-04-25 22:16:40 发布

您现在位置:Python中文网/ 问答频道 /正文

你知道吗怪怪的地址:

import sys

def f ():
    print('f', end = '')
    g()

def g ():
    1 / 0

try:
    f()
except:
    print('toplevel', file = sys.stderr)

Python会话:

Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  6 2014, 22:16:31) [MSC v.1600 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import weird
toplevel
f>>>

为什么“toplevel”在“f”之前打印?你知道吗

如果移除end = ''file = sys.stderr,则不会发生这种情况。你知道吗


Tags: import地址defstderrsysbitoctfile
1条回答
网友
1楼 · 发布于 2024-04-25 22:16:40

因为stdout和stderr是线缓冲的。它们缓冲字符,只有当您有一个完整的行时才会刷新。你知道吗

通过设置end='',您可以确保没有完整的行,并且直到稍后Python交互式解释器输出>>>并显式刷新缓冲区时才刷新缓冲区。你知道吗

如果删除file=sys.stderr,则再次输出到sys.stdout,并将toplevel\n打印为print()添加新行,从而刷新sys.stdout缓冲区。你知道吗

通过将flush=True参数设置为print()函数(python3.3及更高版本)或调用sys.stdout.flush(),可以显式强制刷新。你知道吗

相关问题 更多 >