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

问题描述 投票:0回答:1

我已经删除了 pysnmp 并安装了 pysnmp-lextudio,试图将我的代码库提升到 python 3.12.2

使用以前的 pysnmp 版本运行的代码现在返回错误: “元组”对象不是迭代器

有问题的代码是最后一行的 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 进行行为。

python typeerror generator snmp pysnmp
1个回答
0
投票

因为库

pynsmp
似乎从 getCmd 函数返回了
生成器
(请参阅文档
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

所以 tl;dr:在旧版本中,

g
是一个生成器,在新版本中它是一个响应。

© www.soinside.com 2019 - 2024. All rights reserved.