如果我希望python程序也打印其他id事件,那么它会一直打印相同的id事件

如果我希望python程序也打印其他id事件,那么它会一直打印相同的id事件,python,Python,我是你们社区的新手,但我的一个代码有问题。我正在开发一个程序,用于将shell命令“show vlan”和“show mac address table”汇总为一个表,其中只包含我们希望打印的信息。这些信息是我们正在使用的交换机的vlan ID、每个mac地址的vlan数以及动态的mac地址数。不幸的是,它一直只打印一个vlan id,而不打印交换机的其他id,而且总是相同的。我想解决这个问题。我是python的大三学生,我很确定我的代码在什么地方出错了,但我不知道在哪里 我使用devnet网站

我是你们社区的新手,但我的一个代码有问题。我正在开发一个程序,用于将shell命令“show vlan”和“show mac address table”汇总为一个表,其中只包含我们希望打印的信息。这些信息是我们正在使用的交换机的vlan ID、每个mac地址的vlan数以及动态的mac地址数。不幸的是,它一直只打印一个vlan id,而不打印交换机的其他id,而且总是相同的。我想解决这个问题。我是python的大三学生,我很确定我的代码在什么地方出错了,但我不知道在哪里

我使用devnet网站的这个示例来找到一种方法来编写要求我编写的代码:

这是我的代码:

import json
import cisco
from cli import *

shVlan = json.loads(clid('show vlan'))

shMacAdr = json.loads(clid('show mac address-table'))

mac_counter = 0

print('  | VlanId | @Mac/vlan')
print('--|--------|-----------')

for i in range (0, len(shVlan['TABLE_vlanbrief']['ROW_vlanbrief'])):

    vlan = shVlan['TABLE_vlanbrief']['ROW_vlanbrief'][i]

    vlanId = int(vlan['vlanshowbr-vlanid'])

for j in range (0, len(shMacAdr['TABLE_mac_address'] ['ROW_mac_address'])):

    mac_adr = shMacAdr['TABLE_mac_address']['ROW_mac_address'][j]

    if mac_adr['disp_vlan'] == vlan['vlanshowbr-vlanid']:

         mac_counter = mac_counter + 1

total_mac_dyn = 0

for k in range (0, len (shMacAdr['TABLE_mac_address']['ROW_mac_address'])):

     mac = shMacAdr['TABLE_mac_address']['ROW_mac_address'][k]

         if mac['disp_is_static'] == 'disabled':

             total_mac_dyn = total_mac_dyn + 1

l = 0

while l < len(shVlan['TABLE_vlanbrief']['ROW_vlanbrief']) and l <   len(shMacAdr['TABLE_mac_address']['ROW_mac_address']):
     l = l +1
     print('%2d| %5d  | %5d') % (l, vlanId, mac_counter)
     print('--|--------|-----------')

print('Total @Mac dynamiques| %2d') % (total_mac_dyn)
print('---------------------|----')
导入json
进口思科
从cli导入*
shVlan=json.loads(clid('showvlan'))
shMacAdr=json.loads(clid('show mac address table'))
mac_计数器=0
打印(“| VlanId |@Mac/vlan”)
打印('------------------')
对于范围内的i(0,len(shVlan['TABLE\u vlanbrief']['ROW\u vlanbrief']):
vlan=shVlan['TABLE\u vlanbrief']['ROW\u vlanbrief'][i]
vlanId=int(vlan['vlanshowbr-vlanId'])
对于范围内的j(0,len(shMacAdr['TABLE\u mac\u address']['ROW\u mac\u address']):
mac_adr=shMacAdr['TABLE_mac_address']['ROW_mac_address'][j]
如果mac_adr['disp_vlan']==vlan['vlanshowbr-vlanid']:
mac_计数器=mac_计数器+1
总mac动态=0
对于范围内的k(0,len(shMacAdr['TABLE\u mac\u address']['ROW\u mac\u address']):
mac=shMacAdr['TABLE\u mac\u address']['ROW\u mac\u address'][k]
如果mac['disp\u是静态的']=='disabled':
总计=总计+1
l=0
而l
我使用cisco的沙箱查找交换机的表: 我问:

我对其进行了转换,以便可以看到交换机内部的内容,这就是我的表shVlan(在我的代码中)的内容:

然后我对“show mac address table”命令做了同样的操作:

我对它进行了转换,这样我就可以看到开关中有什么,这样我就可以将它用于我的表shMacAdr(在我的代码中): 这就是转换的答案:

这就是我使用命令“pyhton bootflash:/scripts(因为它在scripts doc中)/mac_vlan.py(因为它是我文件的名称)”时代码的输出:


我希望我能说得更清楚一点,我仍然不太明白如何让自己变得可以理解。对不起,屏幕是我发现的唯一能说明我如何创建代码的东西

vlanId将在循环的每次迭代中被覆盖。 因此,您总是只返回找到的最后一个Id


您最好使用一个列表并附加不同的ID

您可以学习许多东西来改进代码

1) 通过阵列循环: 在数组中循环时,可以使用

对于数组中的数组元素:
另一个数组。追加(数组元素)
2) 当您想要同时循环通过2个或更多阵列时,可以使用zip

对于zip中的元素1、元素2(array1、array2):
#用元素1和元素2做一些事情
使用zip,您将获得与使用相同的功能

while i < len(array1) and i < len(array2):
    element1 = array1[i]
    element2 = array2[i]
    i = i + 1

我的问题已经解决了,谢谢大家的帮助和对我的好意!
祝你今天愉快

你好@YoruTakara,欢迎光临。我建议您花点时间改进问题的格式:您将有更多机会得到满意的答案!特别是,检查原因并以纯文本而不是图像的形式发布代码。当你发布截图时,使用电脑的截图功能,不要用手机拍照。查找所有VLAN信息的循环需要将结果放入列表中。每次只需覆盖
vlanId
变量,因此最后它只有最后一个值。对于j
和k循环,您不需要同时使用
。您可以在同一个循环中相加这两个总数。谢谢您的回答,但我该怎么做?^^抱歉,我刚刚进入编程的第一年……如果你不打算展示如何做,这应该只是一个评论,而不是答案。我已经发布了这条评论。实现这一点的一种方法是:vlanId=[]在vlan|u列表中的I:vlanId[I]=int(vlan['vlanshowbr-vlanId'])在while循环中,当l