如何在Python中获取Linux服务器上iftop的实时控制台输出?
解决Python实时获取iftop输出的问题
你的代码存在几个细节问题导致无法实时获取输出,下面是修正方案和完整实现:
问题分析
- 命令参数传递不规范:
["iftop -t"]这种写法在shell=True下虽能运行,但拆分参数的方式更安全易维护; - 未处理输出缓冲:默认subprocess采用全缓冲模式,输出会攒够缓冲区才推送,无法实时获取;
- 缺少主动读取逻辑:启动进程后需要循环读取stdout才能拿到输出内容。
完整实现代码
import subprocess def realtime_iftop_parser(): # 启动iftop,-t参数强制纯文本模式输出(无终端控制字符) proc = subprocess.Popen( ["iftop", "-t"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, # 合并错误输出到标准输出,避免遗漏信息 text=True, bufsize=1, # 启用行缓冲,确保输出实时刷新 universal_newlines=True ) # 实时读取并处理每一行输出 try: for line in proc.stdout: # 这里替换成你的解析逻辑,比如提取IP、流量数据 print(line.strip()) except KeyboardInterrupt: # 捕获Ctrl+C,终止进程 proc.terminate() print("\n已停止iftop数据读取") if __name__ == "__main__": realtime_iftop_parser()
关键说明
-t参数:iftop默认是交互式终端输出,包含大量光标控制字符,-t切换为纯文本模式,适合程序解析;bufsize=1:设置行缓冲模式,让subprocess每输出一行就立即推送到stdout,保证实时性;- 合并stderr:iftop可能输出警告或错误信息,
stderr=subprocess.STDOUT能让你在同一个流里获取所有内容; - 权限问题:iftop需要root权限才能获取网络数据,运行脚本时记得加
sudo。
内容的提问来源于stack exchange,提问作者HOHOOH
相关产品推荐
相关产品推荐

