如何通过Python获取外部exe进程的控制台输出并提取最后3行
解决方案:用Python实时捕获外部进程控制台输出的最后3行
我来给你一个完全贴合需求的实现方案——不用修改目标exe本身,就能实时抓取它的控制台输出,始终保留最新3行内容,还能把这些内容转发到你需要的任何地方(而非默认控制台)。核心是用Python的subprocess模块管控进程并捕获输出,同时维护一个缓存列表来追踪最新的3行内容。
完整可运行代码
import subprocess import time def Update(lines): # 这里替换成你要转发内容的逻辑:比如写入日志、发送API请求、推送到消息队列等 print("=== 最新3行输出 ===") for idx, line in enumerate(lines, 1): print(f" {idx}. {line}") # 示例:写入本地日志文件 # with open("process_output.log", "w", encoding="utf-8") as f: # f.write("\n".join(lines)) def main(): # 替换成你的exe路径和启动参数 process = subprocess.Popen( ["path/to/your/target.exe", "optional_arg1", "optional_arg2"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, # 合并错误输出到标准输出(可选,按需调整) text=True, # 直接读取字符串,无需手动解码字节流 encoding="utf-8" # Windows环境下可能需要改成"gbk",根据exe输出编码调整 ) pre_lines = [] current_lines = [] while True: # 检查进程是否已退出 if process.poll() is not None: # 读取进程退出前剩余的所有输出 remaining_output = process.stdout.read() if remaining_output: for line in remaining_output.splitlines(): stripped_line = line.strip() if stripped_line: current_lines.append(stripped_line) if len(current_lines) > 3: current_lines.pop(0) # 最后一次更新内容 if current_lines != pre_lines: Update(current_lines) pre_lines = current_lines.copy() break # 实时读取一行输出 line = process.stdout.readline() if line: stripped_line = line.strip() if stripped_line: # 跳过空行(可选,不需要可以删除此判断) current_lines.append(stripped_line) # 始终只保留最后3行 if len(current_lines) > 3: current_lines.pop(0) # 内容变化时才触发更新 if current_lines != pre_lines: Update(current_lines) pre_lines = current_lines.copy() else: # 无新输出时短暂休眠,避免占用过多CPU time.sleep(0.1) if __name__ == "__main__": main()
关键细节说明
- 进程启动与输出捕获:用
subprocess.Popen启动目标exe,通过stdout=subprocess.PIPE接管控制台输出,stderr=subprocess.STDOUT可以把错误信息也合并进来(不需要的话可以删掉这个参数)。text=True让我们直接读取字符串,省去手动解码的麻烦。 - 维护最新3行:用
current_lines列表存储输出内容,每次新增行时如果列表长度超过3,就移除最旧的一行(pop(0)),保证列表始终只保留最新的3条记录。 - 避免重复更新:每次更新
current_lines后,和之前的pre_lines对比,只有内容真正变化时才调用Update函数,减少不必要的重复处理。 - 进程退出收尾:循环中用
process.poll()检查进程状态,退出时读取剩余的所有输出并做最后一次更新,确保不会遗漏内容。 - CPU优化:当没有新输出时,短暂休眠0.1秒,避免无限循环占用过多CPU资源。
自定义调整建议
- 编码适配:如果你的exe输出是中文或其他非UTF-8编码,把
encoding参数改成对应的编码(比如Windows控制台常用gbk)。 - 转发逻辑:把
Update函数里的示例代码替换成你需要的转发方式——比如写入数据库、发送到企业微信机器人、推送到MQ队列等。 - 空行处理:如果不需要过滤空行,直接删掉
if stripped_line:的判断即可。
内容的提问来源于stack exchange,提问作者Luke Meppem
相关产品推荐
相关产品推荐

