Python如何捕获不可修改模块的sys.stdout输出及sys.exit场景内容
故障原因分析
你最初的bar.py捕获逻辑不生效,核心原因是不可修改的foo.py中的foo()函数会调用sys.exit(1):
sys.exit()执行时会抛出SystemExit类型的异常,如果你没有主动捕获该异常,会直接终止整个Python进程。你最初的代码没有做异常捕获,执行到foo()时程序直接退出,根本不会运行后续的f.getvalue()、print语句,自然看不到捕获的输出。some_func中的sys.stdout.flush()已经把输出内容写入了重定向的StringIO对象,只是进程提前终止没有机会读取,不是redirect_stdout本身失效。
涉及代码片段
不可修改的foo.py
import sys def some_func(): sys.stdout.write("hello") sys.stdout.flush() def foo(): some_func() sys.exit(1)
最初失效的bar.py
import io from contextlib import redirect_stdout from foo import foo f = io.StringIO() with redirect_stdout(f): foo() s = f.getvalue() print(s)
可行解决方案说明
你后续给出的方案是正确的,核心是主动捕获SystemExit异常,避免进程提前终止:
import io from contextlib import redirect_stdout from foo import foo def capture_output(func): f = io.StringIO() try: with redirect_stdout(f): func() except SystemExit: return f.getvalue() capture_output(foo)
该方案中,即使foo()触发了退出逻辑,也会进入except分支读取已经写入StringIO的输出内容,不会直接终止整个bar.py的运行。
内容的提问来源于stack exchange,提问作者Dariusz Krynicki
相关产品推荐
相关产品推荐

