我正在使用PySNMP。在整个程序中,我需要执行各种SNMP事务,这些事务将相同的参数重用于不同的功能nextCmd
,getCmd
和setCmd
。为了简化本文,我们假设我仅使用getCmd
函数。我知道此功能可以在多个OID上运行,但这不是我当前的需要。在下面,我刚刚拉出了受管设备的systemName。
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData(snmp_community, mpModel=1),
UdpTransportTarget((target, 161)),
ContextData(),
ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0))
))
比方说,稍后在我的脚本中,我需要从同一设备轮询正常运行时间。不必像这样再次创建大多数代码:
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData(snmp_community, mpModel=1),
UdpTransportTarget((target, 161)),
ContextData(),
ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysUpTime', 0))
))
如何将getCmd
函数与其他static
参数一起存储,并仅将OID
传递到变量/函数中,以使代码最小化?
答案 0 :(得分:1)
最简单的方法是将其包装在另一个函数中:
def standard_call(oid):
cmd = getCmd(SnmpEngine(),
CommunityData(snmp_community, mpModel=1),
UdpTransportTarget((target, 161)),
ContextData(),
# Plug in the oid
ObjectType(ObjectIdentity('SNMPv2-MIB', oid, 0)))
return next(cmd)
standard_call('sysUpTime')
standard_call('sysName')
请注意如何将更改的部分设置为参数,并将其他所有内容设置为函数的主体。通常,这是解决“泛化问题”的方法。
这可以通过从传入的元组构造ObjectTypes
来扩展:
def standard_call(*identity_args):
# Construct the ObjectTypes we need
obj_types = [ObjectType(ObjectIdentity(*arg_tup)) for arg_tup in identity_args]
cmd = getCmd(SnmpEngine(),
CommunityData(snmp_community, mpModel=1),
UdpTransportTarget((target, 161)),
ContextData(),
# Spread the list of ObjectTypes as arguments to getCmd
*obj_types)
return next(cmd)
standard_call(('SNMPv2-MIB', 'sysName', 0),
('SNMPv2-MIB', 'sysServices', 0),
('CISCO-FLASH-MIB', 'ciscoFlashCopyEntryStatus', 13))
答案 1 :(得分:1)
如何使用functools.partial
绑定某些参数?
from functools import partial
from pysnmp.hlapi import *
getCmd = partial(
getCmd, SnmpEngine(), CommunityData('public'),
UdpTransportTarget(('demo.snmplabs.com', 161)),
ContextData())
errorIndication, errorStatus, errorIndex, varBinds = next(
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)),
ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysUpTime', 0))))