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

如何在Python中获取终端标准输出(stdout)内容

捕获终端中包含输入命令与输出的内容

你想要捕获类似>>> print('hello')这样的输入命令和对应输出hello的完整终端内容,但直接打印sys.stdout只能得到对象引用,无法获取实际的输入输出文本。下面是两种可行的解决方式:

1. 捕获交互式Python环境的输入输出

如果是在交互式shell中需要记录每一次输入和对应的输出,可以结合重定向stdout实现:

import sys

# 保存原始标准输出
original_stdout = sys.stdout

# 自定义捕获类,同时保留终端输出并记录内容
class OutputCapture:
    def __init__(self):
        self.content = []
    def write(self, text):
        self.content.append(text)
        original_stdout.write(text)
    def flush(self):
        original_stdout.flush()

# 启用捕获
capture = OutputCapture()
sys.stdout = capture

# 模拟交互式命令循环
try:
    while True:
        cmd = input(">>> ")
        # 记录输入的命令
        capture.content.append(f">>> {cmd}\n")
        # 执行命令
        exec(cmd)
except EOFError:
    # 按Ctrl+D退出循环
    pass

# 恢复原始输出
sys.stdout = original_stdout

# 查看捕获的完整内容
print("\n=== 捕获的终端内容 ===")
print(''.join(capture.content))

运行这段代码后,你输入的每一条命令和对应的输出都会被记录下来,退出时会打印所有捕获的内容。

2. 脚本内捕获输入与输出

如果是在自写脚本中需要记录用户输入和脚本输出,可以直接重定向stdout并结合input记录输入:

import sys

original_stdout = sys.stdout
captured_content = []

# 自定义输出捕获类
class CaptureOutput:
    def write(self, s):
        captured_content.append(s)
        original_stdout.write(s)
    def flush(self):
        original_stdout.flush()

sys.stdout = CaptureOutput()

# 示例:获取用户输入并执行
user_cmd = input(">>> ")
# 记录输入命令
captured_content.append(f">>> {user_cmd}\n")
# 执行命令
exec(user_cmd)

# 恢复标准输出
sys.stdout = original_stdout

# 展示捕获的内容
print("\n=== 捕获内容 ===")
print(''.join(captured_content))

为什么之前的代码无效?

sys.stdout本身是一个文件对象,直接打印它只会输出该对象的内存地址(比如<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>),而非实际输出的文本内容。必须通过重定向stdout到自定义对象,拦截所有写入操作才能记录输出内容,再结合记录输入的逻辑,就能获取包含命令和结果的完整终端内容。

内容的提问来源于stack exchange,提问作者user20545517

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:05:10