Невозможно получить доступ к значениям во вложенном словаре для добавления ссылки в сеть

#python #dictionary #mininet

#питон #словарь #мининет

Вопрос:

У меня есть следующий словарь

d={‘s1’: {‘s2’: {}, ‘s3’: {}, ‘s4’: {}}, ‘s2’: {‘s5’: {‘bw’: 20, ‘задержка’: ‘1 мс’}}, ‘s3’:{‘s6’: {‘bw’: 20, ‘delay’: ‘1 мс’}}, ‘s4’: {‘s7’: {‘bw’: 20, ‘delay’: ‘1 мс’}}, ‘s5’: {‘h1’: {‘bw’: 10, ‘задержка’: ‘5 мс’}, ‘h2’: {‘bw’: 10, ‘задержка’: ‘5 мс’}}, ‘s6’: {‘h3’: {‘bw’: 10, ‘задержка’: ‘5 мс’}, ‘h4’: {‘bw’: 10, ‘delay’: ‘5 мс’}}, ‘s7’: {‘h5’: {‘bw’: 10, ‘delay’: ‘5 мс’}, ‘h6’: {‘bw’: 10, ‘delay’:’5 мс’}}}

Я хотел бы получить доступ к значениям bw и delay для ссылки. Например, я хочу addLink(s7,h6,bw=10,delay=5ms) работать.

Я использую для этого следующий код #!/usr/bin/python

 import yaml
#from ruamel import yaml
from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink
def myNetwork():

# Create an instance of Mininet class i.e. the network with default values
net = Mininet(autoStaticArp=True, autoSetMacs=True)

a_yaml_file = open("Complex_Topology.yaml")
parsed_yaml_file = yaml.load(a_yaml_file, Loader=yaml.FullLoader)
parsed_yaml_file["Controllers"]
parsed_yaml_file["Hosts"]
print(parsed_yaml_file["Links"])
parsed_yaml_file["Switches"]

for i in parsed_yaml_file["Controllers"]:
    net.addController(i)
for i in parsed_yaml_file["Hosts"]:
    net.addHost(i)
for i in parsed_yaml_file["Switches"]:
    net.addSwitch(i) 
d=parsed_yaml_file["Links"]
def freeze(x):
    if isinstance(x, dict):
        return frozenset(freeze(items) for items in x.items())
    elif isinstance(x, list):
        return tuple(freeze(value) for value in x)
    return x

for i in d.keys():
    for j in d[i].keys():
        k=freeze(d[i].values) 
        net.addLink(i,j,k)
info( '*** Starting networkn')
net.start()
# Start the Mininet CLI to run commands
CLI(net)
# Stop the network
net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    myNetwork()
 

Я получаю следующую ошибку

 Traceback (most recent call last):

File "new.py", line 83, in <module>
myNetwork()
File "new.py", line 73, in myNetwork
net.addLink(i,j,k)
File "/home/sudhanshu/Desktop/SDN/mininet/net.py", line 400, in addLink
link = cls( node1, node2, **options )
File "/home/sudhanshu/Desktop/SDN/mininet/link.py", line 450, in __init__
self.makeIntfPair( intfName1, intfName2, addr1, addr2,
File "/home/sudhanshu/Desktop/SDN/mininet/link.py", line 495, in makeIntfPair
return makeIntfPair( intfname1, intfname2, addr1, addr2, node1, node2,
File "/home/sudhanshu/Desktop/SDN/mininet/util.py", line 266, in makeIntfPair
raise Exception( "Error creating interface pair (%s,%s): %s " %
Exception: Error creating interface pair (s1-eth<built-in method values of dict object at 0x7f1f6b6035c0>,s2-eth1): bash: built-in: No such file or directory
 

Я пытался манипулировать своим кодом, но потерпел неудачу.

Может ли кто-нибудь, пожалуйста, помочь мне с этим?

Комментарии:

1. k=freeze(d[i].values) Вы забыли круглые скобки в конце .values() функции. Вместо этого вы фактически ссылаетесь на объект функции values .

2. Спасибо, что указали на это. Но я все еще получаю ошибку-Исключение: ошибка создания пары интерфейсов (s1-ethdict_values([{}, {}, {}]), s2-eth1): bash: синтаксическая ошибка рядом с неожиданным токеном `(‘

3. bash? этот код вызывает bash? вам придется показать нам эту часть кода.

4. код очень длинный для комментариев. Как я могу показать это вам.

5. Не помещайте код в комментарий; отредактируйте вопрос.

Ответ №1:

Если вы хотите вызвать метод as addLink(s7, h6, bw=10, delay=5ms) , то вы можете создать ссылки, используя:

 for i in d:
    for j in d[i]:
        net.addLink(i, j, **d[i][j])
 

Комментарии:

1. Спасибо за комментарий. Он создает сеть, но пропускная способность и задержка отсутствуют в ссылке.

2. Обратите внимание, что в ваших входных данных отсутствуют некоторые ссылки bw и delay (например, от s1 до s2), в то время как у других есть (от s7 до h5)

3. Вы правы. Я проанализировал файл yaml, где некоторые ссылки имеют параметры ссылки, а некоторые нет. Мне нужно построить сеть за один раз, т.е. через цикл.

4. Я использовал следующее для i в d.keys(): для j в d[i].keys(): если d[i].values() является dict: #k=freeze(d[i].values()) net.addLink(i,j,**d[i] [j]) еще: net.addLink(i,j)

5. Я все еще не получаю параметры ссылки.