TypeError: __init__() 收到意外的关键字参数 'delay

8 投票
2 回答
13261 浏览
提问于 2025-04-18 09:12

我在下面这个Python程序中遇到了一个类型错误,问题出现在构造函数被调用的时候。如果我去掉延迟这个参数,我也会遇到同样的错误,错误信息是“bw”。我搞不清楚哪里出错了,请帮帮我。

我正在尝试用Python创建一个网络拓扑。

#!/usr/bin/python

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.util import irange,dumpNodeConnections
from mininet.log import setLogLevel

class CustomTopo(Topo):

    def __init__(self, linkopts1, linkopts2, linkopts3, fanout=2, **opts):
        # Initialize topology and default options
        Topo.__init__(self, **opts)

        # Add your logic here ...
        switch=self.addSwitch('c1')

        self.linkopts1=linkopts1
        self.linkopts2=linkopts2
        self.linkopts3=linkopts3

        self.fanout=fanout
        n=0

        for i in irange(1,fanout):
                s=self.addSwitch('a%s' % i)
                self.addLink(switch,s,**linkopts1)

                if i==1:
                        n=0
                else:
                        n=1
                for j in irange(1,fanout):
                        if n==0:
                                sw=self.addSwitch('e%s' % j)              #To generate labels e1, e2, e3 and e4:
                        else:                                             #if n=0, edge switches e1 and e2 are added to a1
                                sw=self.addSwitch('e%s' % (j+2))            #if n=1, edge switched e3 and e4 are added to a2
                        self.addLink(s,sw,**linkopts2)

                        for k in irange(1,fanout):
                                if ((j==1)&(n==0)):
                                        host=self.addHost('h%s' % k)      #For edge switch e1, j=1,n=0. End-hosts are h1 and h2.
                                elif ((j==2)&(n==0)):
                                        host=self.addHost('h%s' % (k+2))  #For edge switch e2, j=2,n=0. End-hosts are h3 and h4.
                                elif ((j==1)&(n==1)):
                                        host=self.addHost('h%s' % (k+4))  #For edge switch e3, j=1,n=1. End-hosts are h5 and h6.
                                elif ((j==2)&(n==1)):
                                        host=self.addHost('h%s' % (k+6))  #For edge switch e4, j=2,n=1. End-hosts are h7 and h8.
                                self.addLink(sw,host,**linkopts3)


def treeTest():
        linkopts1=dict(bw=10, delay='5ms')
        linkopts2=dict(bw=10, delay='5ms')
        linkopts3=dict(bw=10, delay='5ms')
        topo=CustomTopo(linkopts1,linkopts2,linkopts3,fanout=2)
        net=Mininet(topo)
        net.start()
        print "Dumping node connections"
        dumpNodeConnections(net.hosts)
        print "Testing network connectivity"
        net.pingAll()
        net.stop()

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



topos = { 'custom': ( lambda: CustomTopo() ) }

我收到的错误追踪信息是:

Traceback (most recent call last):
  File "CustomTopo.py", line 70, in <module>
    treeTest()
  File "CustomTopo.py", line 60, in treeTest
    net=Mininet(topo)
  File "/usr/local/lib/python2.7/dist-packages/mininet-2.1.0-py2.7.egg/mininet/net.py", line 164, in __init__
    self.build()
  File "/usr/local/lib/python2.7/dist-packages/mininet-2.1.0-py2.7.egg/mininet/net.py", line 357, in build
    self.buildFromTopo( self.topo )
  File "/usr/local/lib/python2.7/dist-packages/mininet-2.1.0-py2.7.egg/mininet/net.py", line 344, in buildFromTopo
    self.addLink( src, dst, srcPort, dstPort, **params )
  File "/usr/local/lib/python2.7/dist-packages/mininet-2.1.0-py2.7.egg/mininet/net.py", line 287, in addLink
    return cls( node1, node2, **defaults )
TypeError: __init__() got an unexpected keyword argument 'delay'

2 个回答

0

在mininet或者我猜是OpenVswitch中,有一个对象正在接收你的linkopts参数,其中包含了带有带宽(bw)和延迟(delay)的关键字参数。不过,这个对象并不认识你使用的这些关键字参数。可能是你使用的mininet和openvswitch版本不匹配吧?我看到当前的例子中有提到bw和delay,但我没有足够的经验来判断这些是不是过时的引用,或者你使用的是旧的库。

不幸的是,想要试用你的代码片段需要的配置比我能花的时间要多得多。我尝试简单地运行“apt-get openvswitch-controller python-openvswitch”,但我没能让它运行起来。

24

记得把链接类型设置为tc。

在你的脚本里像下面这样指定:

net = Mininet(topo=topo, link=TCLink)

记得在你的Python脚本中导入TCLink:

from mininet.link import TCLink

如果你想从命令提示符调用mininet,那么就把--link参数设置成这样:

sudo mn --custom custom.py --topo customtopo --link tc

撰写回答