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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:25:27