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

Python基于Netmiko面向对象开发网络设备管控出现AttributeError问题

错误原因

  • 类定义缩进错误:实际编写代码时send_command、disconnect方法缩进层级错误,被包含在connect方法内部,不属于Switch类的公共成员,实例调用时自然找不到对应属性。
  • 实例化逻辑错误:没有按标准方式创建Switch类实例,而是直接调用Switch.connect()方法获取Netmiko原生连接对象,该对象本身不存在自定义的send_command方法,调用就会触发属性错误。
  • 类缓存未更新:在交互式环境(如Jupyter、Ipython)运行时,修改类定义后未重新加载类,旧的类结构中没有新增的send_command方法。

解决方案

1. 修正类结构与缩进

确保所有方法和__init__同级,同时优化原有代码的潜在问题(如连接失败后空指针报错、异常捕获范围不精准等),修正后的类代码如下:

import netmiko
from netmiko import NetMikoTimeoutException, NetMikoAuthenticationException

# 公共参数统一维护
device_type = "cisco_ios"
username = "替换为实际用户名"
password = "替换为实际密码"
failed = []

class Switch:
    def __init__(self, hostname):
        self.hostname = hostname
        self.connection = None
        self.connect()

    def connect(self):
        try:
            print(f"正在连接{self.hostname}...")
            conn = netmiko.ConnectHandler(
                ip=self.hostname,
                device_type=device_type,
                username=username,
                password=password
            )
        except (NetMikoTimeoutException, NetMikoAuthenticationException) as e:
            err_info = f"{self.hostname}:{str(e)}"
            failed.append(err_info)
            raise ConnectionError(err_info) from e
        except ValueError as v:
            err_info = f"{self.hostname}:{str(v)}"
            failed.append(err_info)
            raise ConnectionError(err_info) from v
        else:
            self.connection = conn

    def send_command(self, command):
        if not self.connection:
            raise ConnectionError(f"{self.hostname}未建立有效连接,无法执行命令")
        return self.connection.send_command(command)

    def disconnect(self):
        if self.connection:
            self.connection.disconnect()
            print(f"已断开与{self.hostname}的连接")

2. 使用正确的实例调用逻辑

批量操作的标准示例如下:

# 待操作设备地址列表
device_ips = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
switch_instances = []

# 批量建立连接
for ip in device_ips:
    try:
        sw = Switch(ip)
        switch_instances.append(sw)
    except ConnectionError as e:
        print(f"初始化设备失败:{str(e)}")
        continue

# 逐台下发命令
for sw in switch_instances:
    try:
        res = sw.send_command("show ip interface brief")
        print(f"\n===== {sw.hostname} 执行结果 =====")
        print(res)
    except Exception as e:
        print(f"{sw.hostname} 命令执行失败:{str(e)}")

# 统一关闭所有连接
for sw in switch_instances:
    sw.disconnect()

3. 刷新类缓存

在交互式环境运行时,修改类定义后重新执行类定义代码块,或者重启运行内核,确保加载的是最新的类结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:27:04