Python如何判断终端光标是否在行首 解决tqdm循环日志同行问题
光标位置判断及tqdm日志冲突解决方案
光标位置获取接口说明
Python标准库没有提供跨平台的直接获取终端光标位置的官方接口,该能力依赖底层终端的实现,需要分平台单独实现:
- *nix(Linux/macOS)平台:可以通过发送ANSI转义序列
\x1b[6n查询光标位置,终端会返回\x1b[{row};{column}R格式的结果,判断column是否等于1即可确认光标是否在行首。需要注意该方法需要终端支持ANSI转义序列,且需要把终端设为非规范读取模式才能拿到返回值。 - Windows平台:需要通过
ctypes调用Win32 API的GetConsoleScreenBufferInfo函数,获取控制台缓冲区信息中的光标列坐标进行判断。
更适配tqdm场景的解决方案
你遇到的tqdm进度条和日志同行的问题,不需要自行实现光标位置判断,tqdm已经内置了专门的打印能力:
使用tqdm.write()方法替代原生print输出日志,该方法会自动处理进度条的状态:先临时清除当前行的进度条、打印日志内容,再在下一行恢复进度条的显示,完全避免内容重叠、同行的问题,天然跨平台兼容。
基础使用示例
from tqdm import tqdm import time for item in tqdm(range(20)): # 需要打印日志的场景 if item % 4 == 0: tqdm.write(f"已完成{item}项任务,处理正常") time.sleep(0.3)
适配logging模块的方案
如果项目使用logging模块打印日志,可以自定义Handler将日志输出转发给tqdm.write:
import logging from tqdm import tqdm class TqdmLogHandler(logging.Handler): def emit(self, record): log_msg = self.format(record) tqdm.write(log_msg) # 配置logging使用自定义Handler logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", handlers=[TqdmLogHandler()] )
内容的提问来源于stack exchange,提问作者EZLearner
相关产品推荐
相关产品推荐

