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

Netmiko执行交换机两条命令返回结果均相同问题排查求助

问题修复方案

错误根源

  • 核心问题是re_table变量被重复赋值覆盖:你先将re_table赋值为showDesc对应的TextFSM模板对象,紧接着又重新赋值为showVlan对应的模板对象,后续解析第一条命令输出、写入第一个CSV表头时,用的都是已经被覆盖的showVlan模板,自然两个文件内容都是show vlan的相关结果。
  • 额外冗余:代码中定义了两个重名的cdp函数,没有任何实际作用,可以直接删除。
  • 小缺陷:打开模板文件、CSV文件时没有使用上下文管理器,存在文件句柄泄漏的风险。

修复后代码

import textfsm
from netmiko import ConnectHandler

def device2(whid, idf, username, password):
    checkOnline = {
        "device_type": "cisco_ios",
        "host": "switch1-1",
        "username": username,
        "password": password,
    }
    command1 = "show interfaces description"
    command2 = "show vlan"

    with ConnectHandler(**checkOnline) as net_connect:
        out1 = net_connect.send_command(command1)
        out2 = net_connect.send_command(command2)

    # 处理第一条命令输出
    with open("/var/assets/showDesc.textfsm") as template1:
        re_table1 = textfsm.TextFSM(template1)
    fsm_results1 = re_table1.ParseText(out1)

    with open("/var/assets/file1.csv", "w+") as outfile1:
        # 写入表头
        outfile1.write(",".join(re_table1.header) + "\n")
        # 写入内容
        for row in fsm_results1:
            outfile1.write(",".join(row) + "\n")

    # 处理第二条命令输出
    with open("/var/assets/showVlan.textfsm") as template2:
        re_table2 = textfsm.TextFSM(template2)
    fsm_results2 = re_table2.ParseText(out2)

    with open("/var/assets/file2.csv", "w+") as outfile2:
        # 写入表头
        outfile2.write(",".join(re_table2.header) + "\n")
        # 写入内容
        for row in fsm_results2:
            outfile2.write(",".join(row) + "\n")

优化说明

  • 将两个模板的TextFSM对象分别赋值给不同的变量re_table1、re_table2,避免互相覆盖
  • 使用with关键字管理所有文件的打开/关闭逻辑,自动释放文件句柄
  • 简化了CSV写入的循环逻辑,直接用join方法拼接每行内容,代码更简洁
  • 删除了无用的重名cdp函数,减少冗余代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:57:04