如何全局静默模块A的stdout输出,仅保留模块B日志显示?
解决方案
这问题我之前也碰到过,刚好有几个便捷的方法能满足你的需求,尤其是你要的一行代码解决方案:
一行代码同时禁用模块A的print语句和logger输出
如果你的脚本开头需要一次性搞定模块A的print和自动创建的logger,直接用这行代码:
import moduleA, logging; moduleA.print = lambda *args, **kwargs: None; logging.getLogger('moduleA').setLevel(logging.CRITICAL + 1)
各部分原理解释
- 禁用模块A的print:通过替换
moduleA命名空间下的print为一个空lambda函数,模块A内部所有直接调用print()的代码都会变成无操作,不会向stdout输出任何内容。 - 禁用模块A的logger:
logging.getLogger('moduleA')会获取模块A自动创建的logger实例,把它的日志级别设为CRITICAL+1(比logging最高级别还高),这样该logger的所有日志消息都会被过滤掉,不会输出。
特殊情况处理
如果模块A在导入阶段就执行了print语句,上面的方法可能没法拦截(因为替换moduleA.print是在导入之后),这时候可以用临时重定向stdout的方式,一行代码搞定:
import sys; old_out, sys.stdout = sys.stdout, open('/dev/null', 'w'); import moduleA; sys.stdout = old_out # Linux/macOS
Windows系统则把'/dev/null'换成'nul'即可:
import sys; old_out, sys.stdout = sys.stdout, open('nul', 'w'); import moduleA; sys.stdout = old_out # Windows
这行代码会在导入模块A时把stdout临时定向到空设备,导入完成后恢复,这样导入阶段的print就会被吞掉,再结合之前的moduleA.print替换,就能彻底禁用模块A所有场景下的print输出。
内容的提问来源于stack exchange,提问作者John Titor
相关产品推荐
相关产品推荐

