2017-09-22 54 views
0

如果我嘗試這樣的事情,我pysnmp - ValueError異常:值過多解壓(預計4)

ValueError: too many values to unpack (expected 4)

有人能解釋爲什麼嗎?

from pysnmp.hlapi import * 

errorIndication, errorStatus, errorIndex, varBinds = nextCmd(
    SnmpEngine(), 
    CommunityData('public', mpModel=1), 
    UdpTransportTarget(('giga-int-2', 161)), 
    ContextData(), 
    ObjectType(ObjectIdentity('1.3.6.1.2.1.31.1.1.1.1')), 
    lexicographicMode=False 
) 
if errorIndication: 
    print(errorIndication) 
elif errorStatus: 
    print('%s at %s' % (errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) 
else: 
    for v in varBinds: 
     for name, val in v: 
      print('%s = %s' % (name.prettyPrint(), val.prettyPrint())) 
+1

的可能的複製[Python的ValueError異常:值過多解壓](https://stackoverflow.com/questions/7053551/python-valueerror-too-many-values-to-unpack) –

+1

的可能的複製['太多的值解開',迭代字典。 key => string,value => list](https://stackoverflow.com/questions/5466618/too-many-values-to-unpack-iterating-over-a-dict-key-string-value-list) – chrisis

回答

0

nextCmd()功能(以及其他pysnmp功能)返回一個Python生成器對象,你應該遍歷:

>>> from pysnmp.hlapi import * 
>>> g = nextCmd(SnmpEngine(), 
...    CommunityData('public'), 
...    UdpTransportTarget(('demo.snmplabs.com', 161)), 
...    ContextData(), 
...    ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr'))) 
>>> 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'))]) 

您可以使用此發電機就像任何的Python迭代,例如一個循環。或者,如果您只需要運行一個請求/響應,則可以簡單地在其上調用next

在每次迭代時,pysnmp發出一個請求(一個或多個取決於環境),要求一個大於前一個的OID。這樣你就可以「走」SNMP代理,直到你跳出循環或耗盡代理端的OID。

您的錯誤在於您期望pysnmp的nextCmd立即運行SNMP查詢並返回一個值。相反,pysnmp爲您提供了一個生成器協程,您可以重複使用它來執行多個查詢(您也可以通過OID查詢來獲得.send())。

+0

這很清楚。但在上面的例子中,誰調用next()?做一個調試它會運行4個snmp請求。 – Celio

+0

編輯原始答案試圖回答你的問題。 –

0

感謝您的回答。我重寫了代碼。現在它正在做我想要的。它只是搜索'1.3.6.1.2.1.31.1.1.1.x'樹。

from pysnmp.hlapi import * 

for errorIndication, errorStatus, errorIndex, varBinds in nextCmd(
    SnmpEngine(), 
    CommunityData('public', mpModel=1), 
    UdpTransportTarget(('giga-int-2', 161)), 
    ContextData(), 
    ObjectType(ObjectIdentity('1.3.6.1.2.1.31.1.1.1.1')), 
    lexicographicMode=False 
): 
    if errorIndication: 
     print(errorIndication) 
    elif errorStatus: 
     print('%s at %s' % (errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) 
    else: 
     for v in varBinds: 
      print(v.prettyPrint()) 

SNMPv2-SMI::mib-2.31.1.1.1.1.1 = sc0 
SNMPv2-SMI::mib-2.31.1.1.1.1.2 = sl0 
SNMPv2-SMI::mib-2.31.1.1.1.1.3 = sc1 
SNMPv2-SMI::mib-2.31.1.1.1.1.5 = VLAN-1 
SNMPv2-SMI::mib-2.31.1.1.1.1.6 = VLAN-1002 
... 
相關問題