如何修复提取iptraf-ng值的Python脚本缩进错误?
问题修正方案
1. 缩进错误修复
Python对缩进要求严格,函数内所有代码块必须保持一致的缩进(推荐使用4个空格)。你的代码中cmd = ...行用了3个空格,后续代码用了4个,导致IndentationError。将函数内所有代码统一为4个空格缩进即可解决该问题。
2. 其他潜在问题修复
- 文件路径错误:
open('home/Aliexer/iptraf.log')缺少根目录符号/,会导致脚本在当前目录下查找不存在的home文件夹,应改为open('/home/Aliexer/iptraf.log')。 - iptraf-ng运行模式问题:默认执行
iptraf-ng -i ens160会进入交互式界面,脚本会卡住无法继续执行。需添加-t <秒数>参数指定采集时长,让程序自动退出后再读取日志。
修正后的完整代码
import subprocess def get_iptraf_values(interface): # 用传入的interface参数拼接命令,添加-t参数指定采集10秒(可自行调整时长) cmd = f"iptraf-ng -i {interface} -L /home/Aliexer/iptraf.log -t 10" subprocess.run(cmd.split(), check=True) # 修正文件路径,添加根目录/ with open('/home/Aliexer/iptraf.log') as f: lines = f.readlines() values = {} for line in lines: if 'PktsIn' in line: values['PktsIn'] = int(line.split()[1]) elif 'IP In' in line: values['IP In'] = int(line.split()[1]) elif 'BytesIn' in line: values['BytesIn'] = int(line.split()[1]) elif 'InRate' in line: values['InRate'] = float(line.split()[1]) elif 'PktsOut' in line: values['PktsOut'] = int(line.split()[1]) elif 'IP Out' in line: values['IP Out'] = int(line.split()[1]) elif 'BytesOut' in line: values['BytesOut'] = int(line.split()[1]) elif 'OutRate' in line: values['OutRate'] = float(line.split()[1]) return values values = get_iptraf_values('ens160') print(values)
额外说明
- 调整
-t 10中的数字可修改采集时长,单位为秒。 - 确保运行脚本的用户对
/home/Aliexer/目录有读写权限,否则无法生成日志文件。 - 未安装iptraf-ng的话,可执行
sudo apt install iptraf-ng(Debian/Ubuntu系)或对应发行版的安装命令完成部署。
内容的提问来源于stack exchange,提问作者aliexer Ramirez
相关产品推荐
相关产品推荐

