PAYATHON 2026

如何让 pysnmp 在遍历完指定表列后停止?

数据小许

解决方法

在题目使用的同步生成器接口中,为 nextCmd() 添加 lexicographicMode=False,就可以将遍历限制在初始 OID 的子树内。对当前代码来说,读取完 dot1dTpFdbPort 的所有实例后,遍历就会停止。

该接口默认使用 lexicographicMode=True,允许继续遍历后续 OID。参数行为和子树判断参见 PySNMP 同步 nextCmd 源码与说明。

修改后的代码

保留原来的查询对象,在最后增加参数,并整理 Python 缩进:

from pysnmp.hlapi import *

for errorIndication, errorStatus, errorIndex, varBinds in nextCmd(
    SnmpEngine(),
    CommunityData('public', mpModel=0),
    UdpTransportTarget(('localhost', 161)),
    ContextData(),
    ObjectType(ObjectIdentity('BRIDGE-MIB', 'dot1dTpFdbPort')),
    lexicographicMode=False,
):
    if errorIndication or errorStatus:
        print(errorIndication or errorStatus)
        break

    for varBind in varBinds:
        print(' = '.join([x.prettyPrint() for x in varBind]))

为什么会继续读取其他表?

nextCmd() 会反复执行 SNMP GETNEXT,沿 OID 的字典序获取下一个可访问对象。目标列结束后,后面仍可能有其他有效对象。此时原来的错误检查不会触发,程序就会继续输出 dot1dTpFdbStatus 等数据。

设置 lexicographicMode=False 后,生成器会检查返回的 OID 是否仍属于初始 OID 子树,越界后结束迭代。为了识别边界,仍可能收到一次包含越界 OID 的响应,但当前单列查询不会将它作为正常结果输出。

注意事项

  • dot1dTpFdbPort 是表中的一列,当前设置限制的是这一列的子树。如果需要读取整张表,应选择相应的表或条目 OID 作为起点。
  • maxRows 可以限制返回行数,但不能代替 OID 边界判断。行数设得过小会截断有效数据。
  • 示例适用于题目中的 pysnmp.hlapi.nextCmd 同步接口。如果安装环境提供的是其他接口,应按对应接口的文档调整调用方式。

备注:内容仅供参考。