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
相关产品推荐
相关产品推荐

