为什么回溯打印早于打印 url?

min*_*hau 3 python traceback

据我所知,当运行以下代码时,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.')
Run Code Online (Sandbox Code Playgroud)

Tho*_*mas 5

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

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

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

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

print(url, end='', flush=True)
Run Code Online (Sandbox Code Playgroud)

这实际上与以下相同:

import sys

# ...

print(url, end='')
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

或者,您可以删除endkwarg:

print(url)
Run Code Online (Sandbox Code Playgroud)

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