我删除了pyssnmp并安装了pyssnmp—lextudio,试图将我的代码库升级到python3.12.2

使用以前的pysnmp版本运行的代码现在返回错误: '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.

推荐答案

因为库pynsmp似乎从getCmd函数返回一个generator(参见documentationpysnmp-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是一个生成器,在新版本中,它是一个响应.

Python相关问答推荐

如何自动抓取以下CSV

比较两个数据帧并并排附加结果(获取性能警告)

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

带条件计算最小值

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

未删除映射表的行

如何获取TFIDF Transformer中的值?

数据抓取失败:寻求帮助

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

mypy无法推断类型参数.List和Iterable的区别

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

如何获取Python synsets列表的第一个内容?

并行编程:同步进程

我对这个简单的异步者的例子有什么错误的理解吗?

根据Pandas中带条件的两个列的值创建新列

在Django中重命名我的表后,旧表中的项目不会被移动或删除

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

比较两个有条件的数据帧并删除所有不合格的数据帧

某些值的数值幂和**之间的差异