如何在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
相关产品推荐
相关产品推荐

