python - 为什么回溯打印早于打印网址?
问题描述
据我所知,在运行以下代码时,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.')
解决方案
print
将输出到 STDOUTtraceback.print_exc()
并将输出到 STDERR。STDOUT 是“缓冲的”,而 STDERR 不是。从这篇文章:
默认情况下,程序中的 I/O 是缓冲的,这意味着 IO 不会立即逐个字节地提供服务,而是从临时存储中提供给请求程序...通过缓冲,整个块被立即读入缓冲区,然后单个字节从(快速内存)缓冲区传递给您。
当缓冲区被“刷新”时,它将被显示。通常,如果输出是终端,则缓冲区会在新行处刷新。
在 Python 3 中,您可以使用flush
kwarg 强制执行此操作:
print(url, end='', flush=True)
这实际上与以下内容相同:
import sys
# ...
print(url, end='')
sys.stdout.flush()
或者,您可以删除end
kwarg:
print(url)
请注意,这将在 URL 之后打印一个换行符。这可能是不可取的。
推荐阅读
- python - Plotly:如何设置分组的子图?
- javascript - 如何向查看页面源代码显示元标记,通过 Javascript 添加
- laravel - 调用未定义的方法 Illuminate\Database\Eloquent\Builder::mapInto()
- typescript - 打字稿类型条件扩展对象
- javascript - Javascript - 是 null 还是 true - 最优雅的解决方案是什么?
- azure - 使用 cloud-init 重新启动后未创建交换文件
- ios - 如何在 SwiftUI 中以相同的尺寸显示不同屏幕尺寸的屏幕?
- spring - 当我尝试在 Spring jpa 中进行左连接时出现异常:null;
- javascript - 在 laravel 项目中使用 js 将月份转换为年份
- spring-boot - 是否可以在 Spring boot 中使用并发 JmsListeners 实现有保证的事务行为