首页 > 解决方案 > 为什么回溯打印早于打印网址?

问题描述

据我所知,在运行以下代码时,print(url, end='')将首先打印一行。

然后requests.get(url)引发异常,触发traceback.print_exc().

但在我的测试中,traceback.print_exc()屏幕上的打印早于print(url, end='').

为什么?

另一方面,如果我用 替换traceback.print_exc()print('error occurred')它就像我想的那样工作。

似乎traceback.print_exc()优先级更高?

import traceback

import requests


url = 'http://www.szwb.gov.cn/wap/jggk/gzdt/201809/t20180919_14099889.htm'

try:
    print(url, end='')
    response = requests.get(url)
    # balabala
except Exception as e:
    traceback.print_exc()
    # print('error occurred.')

标签: pythontraceback

解决方案


print将输出到 STDOUTtraceback.print_exc()并将输出到 STDERR。STDOUT 是“缓冲的”,而 STDERR 不是。从这篇文章

默认情况下,程序中的 I/O 是缓冲的,这意味着 IO 不会立即逐个字节地提供服务,而是从临时存储中提供给请求程序...通过缓冲,整个块被立即读入缓冲区,然后单个字节从(快速内存)缓冲区传递给您。

当缓冲区被“刷新”时,它将被显示。通常,如果输出是终端,则缓冲区会在新行处刷新。

在 Python 3 中,您可以使用flushkwarg 强制执行此操作:

print(url, end='', flush=True)

这实际上与以下内容相同:

import sys

# ...

print(url, end='')
sys.stdout.flush()

或者,您可以删除endkwarg:

print(url)

请注意,这将在 URL 之后打印一个换行符。这可能是不可取的。


推荐阅读