#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. Я все еще не получаю параметры ссылки.