因为库pynsmp
似乎从getCmd
函数返回一个generator(参见documentation,pysnmp-lexstudio
已经是performs the query了.
来自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
是一个生成器,在新版本中,它是一个响应.