pysnmp-lextudio 使用 getCmd() 生成器的 next() 导致 TypeError: 'tuple' 对象不是迭代器

1 投票
1 回答
35 浏览
提问于 2025-04-12 20:57

我把pysnmp这个库卸载了,然后安装了pysnmp-lextudio,目的是为了让我的代码能在python 3.12.2上运行。

之前能正常运行的代码现在却出现了错误:'tuple'对象不是一个迭代器。

出问题的代码在最后一行的next()。

from pysnmp.hlapi import *
g = getCmd(SnmpEngine(),
    CommunityData('community', mpModel=1),
    UdpTransportTarget((ipAddress, port)),
    ContextData(),
    ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
        
errorIndication, errorStatus, errorIndex, varBinds = next(g)

欢迎任何建议,设备通过snmp walk正常工作。

1 个回答

3

因为库 pynsmpgetCmd 函数似乎返回了一个 生成器(你可以查看文档),而 pysnmp-lexstudio 已经直接执行查询了。

这是来自 pynsmp-lextudio 网站的例子:

>>> from pysnmp.hlapi import *
>>> g = getCmd(SnmpEngine(),
...            CommunityData('public'),
...            UdpTransportTarget(('demo.pysnmp.com', 161)),
...            ContextData(),
...            ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
>>> g
(None, 0, 0, [ObjectType(ObjectIdentity(ObjectName('1.3.6.1.2.1.1.1.0')), DisplayString('SunOS zeus.pysnmp.com 4.1.3_U1 1 sun4m'))])

而这是 pysnmp 文档中的内容:

>>> from pysnmp.hlapi import *
>>> g = getCmd(SnmpEngine(),
...            CommunityData('public'),
...            UdpTransportTarget(('demo.snmplabs.com', 161)),
...            ContextData(),
...            ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
>>> next(g)
(None, 0, 0, [ObjectType(ObjectIdentity(ObjectName('1.3.6.1.2.1.1.1.0')), DisplayString('SunOS zeus.snmplabs.com 4.1.3_U1 1 sun4m'))])

为什么会发生这样的变化,我也不知道,但请注意第一个例子中缺少了 next()

实际上,如果你这样做:

>>> print(getCmd(SnmpEngine(),
... CommunityData('community', mpModel=1),
... UdpTransportTarget((ipAddress, port)),
... ContextData(),
... ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0))))
(RequestTimedOut('No SNMP response received before timeout'), 0, 0, [])

你会发现命令会立即被调用,而不需要 next

所以简单来说:在你旧版本中,g 是一个生成器,而在新版本中它是一个响应。

撰写回答