You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 01:36:07