如何屏蔽Python fpdf库multi_cell方法产生的控制台输出
问题背景
以下基于Python fpdf库生成PDF表格的代码运行功能正常,但调用multi_cell()方法时会自动在控制台产生打印输出,需要找到可静音/关闭该类控制台打印信息的可行方案:
for j, row in enumerate(data): for datum in row: line_height = lh_list[j] # 匹配当前行对应的行高 if datum is row[0]: pdf.set_font("Times", 'B', size=8) pdf.multi_cell(col_width_name, line_height, datum, border=1, align='L', ln=3, max_line_height=pdf.font_size, fill=True) else: pdf.set_font("Times", size=8) pdf.multi_cell(col_width_value, line_height, datum, border=1, align='C', ln=3, max_line_height=pdf.font_size) pdf.ln(line_height)
可行解决方案
方案1:调整fpdf日志输出等级(适配fpdf2 v2.x+主流版本)
目前主流维护的fpdf2版本,控制台输出均通过Python标准logging模块打印运行提示,只需在初始化PDF对象后,将fpdf对应的日志器等级调整到WARNING及以上,即可屏蔽所有INFO、DEBUG级别的常规打印:
import logging # 完成pdf = FPDF()初始化操作后添加以下代码即可 logging.getLogger("fpdf").setLevel(logging.WARNING)
方案2:临时重定向标准输出(全版本兼容兜底方案)
如果你使用的是较早的、直接通过print()输出提示的fpdf版本,调整日志等级无效的话,可以通过上下文管理器临时将标准输出重定向到系统空设备,在执行multi_cell()相关逻辑时屏蔽所有控制台打印,执行完成后自动恢复原有输出流,不会影响代码其他位置的正常打印:
- 先定义打印屏蔽的上下文工具:
import os import sys class SuppressConsolePrint: def __enter__(self): self.original_stdout = sys.stdout sys.stdout = open(os.devnull, 'w', encoding='utf-8') def __exit__(self, exc_type, exc_val, exc_tb): sys.stdout.close() sys.stdout = self.original_stdout
- 将需要屏蔽打印的表格生成逻辑包裹在上下文管理器中执行:
with SuppressConsolePrint(): for j, row in enumerate(data): for datum in row: line_height = lh_list[j] if datum is row[0]: pdf.set_font("Times", 'B', size=8) pdf.multi_cell(col_width_name, line_height, datum, border=1, align='L', ln=3, max_line_height=pdf.font_size, fill=True) else: pdf.set_font("Times", size=8) pdf.multi_cell(col_width_value, line_height, datum, border=1, align='C', ln=3, max_line_height=pdf.font_size) pdf.ln(line_height)
提示:如果只有部分
multi_cell()调用会触发控制台输出,可仅将对应代码行放入上下文管理器范围内,避免误屏蔽自定义的调试打印内容。如果打印是因单元格内容溢出触发的警告,也可通过调整列宽、提前折行处理内容的方式从根源消除提示。
内容的提问来源于stack exchange,提问作者json_stattham
相关产品推荐
相关产品推荐

