从puresnmp导入walk出现ImportError的技术求助
问题描述
在Ubuntu 22.04.1 LTS(Python 3.10.6)环境中,执行from puresnmp import walk时触发错误:
ImportError: cannot import name 'walk' from 'puresnmp' (/home/rojin/.local/lib/python3.10/site-packages/puresnmp/__init__.py)
已尝试重装puresnmp、更换多种导入方式,均未解决,考虑降级Python但不确定是否可行。相关代码如下:
from pysnmp.hlapi import * from puresnmp import walk IP = "10.10.10.254" COMMUNITY = 'public' OID = '1.3.6.1.2.1.2.2.1.2' for row in walk(IP, COMMUNITY, OID): print(row) IP = "10.10.10.254" COMMUNITY = 'public' OID = '1.3.6.1.2.1.2.2.1.8' for row in walk(IP, COMMUNITY, OID): print(row) # 交换机/路由器单独信息查询 g = getCmd( SnmpEngine(), CommunityData('public'), UdpTransportTarget( ('10.10.10.254', 161)), ContextData(), ObjectType( ObjectIdentity('1.3.6.1.2.1.2.2.1.2.10113'))) errorIndication, errorStatus, errorIndex, varBinds = next(g) for varBind in varBinds: print(' = '.join([x.prettyPrint() for x in varBind])) # 以下为重复或其他SNMP查询代码,省略部分重复内容 # 重启原因查询、系统运行时间查询、电源/风扇/温度查询、CPU/内存查询、版本信息查询、接口总数查询...
解决方案
1. 适配puresnmp版本调整导入路径
puresnmp在v2.x版本后调整了模块结构,walk不再直接暴露在顶层puresnmp模块下,需修改导入语句:
# 替换原导入语句 from puresnmp.api import walk
如果需要保留顶层导入的写法,可以安装v1.x版本的puresnmp:
pip uninstall puresnmp -y pip install puresnmp==1.15.0
2. 无需降级Python
Python 3.10.6与puresnmp的v1.x、v2.x版本均兼容,错误并非Python版本导致,无需降级。
3. 替代方案:用pysnmp实现Walk功能
既然代码中已经引入了pysnmp,可以直接用它实现SNMP Walk,完全替代puresnmp的walk功能,避免版本兼容问题:
from pysnmp.hlapi import * def snmp_walk(ip, community, oid): iterator = bulkCmd( SnmpEngine(), CommunityData(community), UdpTransportTarget((ip, 161)), ContextData(), 0, 25, # 批量获取的数量范围 ObjectType(ObjectIdentity(oid)), lexicographicMode=False ) for errorIndication, errorStatus, errorIndex, varBinds in iterator: if errorIndication: print(errorIndication) break elif errorStatus: print(f"{errorStatus.prettyPrint()} at {errorIndex and varBinds[int(errorIndex)-1][0] or '?'}") break else: for varBind in varBinds: yield varBind # 使用示例 IP = "10.10.10.254" COMMUNITY = 'public' OID = '1.3.6.1.2.1.2.2.1.2' for row in snmp_walk(IP, COMMUNITY, OID): print(' = '.join([x.prettyPrint() for x in row]))
内容的提问来源于stack exchange,提问作者Super MaxLv4
相关产品推荐
相关产品推荐

