我是python的新手。我正在嘗試開發和開放流應用程序。我開始的應用程序是以下文件。您可以看到它實現了一個簡單的以太網交換機。NameError:沒有定義全局名稱'get_all_switch'
https://github.com/osrg/ryu/blob/master/ryu/app/simple_switch.py
現在我有另一個文件
https://github.com/osrg/ryu/blob/master/ryu/topology/api.py
它看起來像它暴露的函數返回的鏈接,並在開關拓撲信息。
如果我試圖在simple_switch.py的init()中調用該函數,它會返回一個錯誤?
def __init__(self, *args, **kwargs):
super(SimpleSwitch, self).__init__(*args, **kwargs)
self.mac_to_port = {}
s_list = get_all_switch(app_manager)
這是我得到的錯誤。
loading app ryu/app/simple_switch.py
loading app ryu.controller.ofp_handler
instantiating app ryu.controller.ofp_handler of OFPHandler
instantiating app ryu/app/simple_switch.py of SimpleSwitch
Traceback (most recent call last):
File "/usr/local/bin/ryu-manager", line 9, in <module>
load_entry_point('ryu==3.8', 'console_scripts', 'ryu-manager')()
File "/usr/local/lib/python2.7/dist-packages/ryu/cmd/manager.py", line 73, in main
services.extend(app_mgr.instantiate_apps(**contexts))
File "/usr/local/lib/python2.7/dist-packages/ryu/base/app_manager.py", line 434, in instantiate_apps
self._instantiate(app_name, cls, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/ryu/base/app_manager.py", line 420, in _instantiate
app = cls(*args, **kwargs)
File "/home/karthik/Projects/ryu/ryu/app/simple_switch.py", line 35, in __init__
s_list = get_all_switch(app_manager)
NameError: global name 'get_all_switch' is not defined
我的問題如下。
1)我能獲得有關使用 我mininet拓撲拓撲信息 - 在劉某/拓撲/ api.py定義get_all_link() - get_all_switch()和 ?
2)如果是,爲什麼上面的代碼不能按預期工作?
我問這裏是因爲蟒蛇我的工作經驗是不是great.I希望能夠在應用程序中simple_switch使用功能拓撲/ api.py裏面simple_switch.py
我進口線。 PY如下
import logging
import struct
from ryu.base import app_manager
from ryu.controller import mac_to_port
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_0
from ryu.lib.mac import haddr_to_bin
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
更新基於答案1:
我已經修改我的代碼如下:
from ryu.base import app_manager
from ryu.controller import mac_to_port
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_0
from ryu.lib.mac import haddr_to_bin
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
import ryu.topology.api
def __init__(self, *args, **kwargs):
super(SimpleSwitch, self).__init__(*args, **kwargs)
self.mac_to_port = {}
s_list = ryu.topology.api.get_all_switch(app_manager.RyuApp)
我現在得到一個新的錯誤:
loading app ryu/app/simple_switch.py
loading app ryu.topology.switches
loading app ryu.controller.ofp_handler
loading app ryu.controller.ofp_handler
instantiating app ryu.topology.switches of Switches
instantiating app ryu.controller.ofp_handler of OFPHandler
instantiating app ryu/app/simple_switch.py of SimpleSwitch
Traceback (most recent call last):
File "/usr/local/bin/ryu-manager", line 9, in <module>
load_entry_point('ryu==3.8', 'console_scripts', 'ryu-manager')()
File "/usr/local/lib/python2.7/dist-packages/ryu/cmd/manager.py", line 73, in main
services.extend(app_mgr.instantiate_apps(**contexts))
File "/usr/local/lib/python2.7/dist-packages/ryu/base/app_manager.py", line 434, in instantiate_apps
self._instantiate(app_name, cls, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/ryu/base/app_manager.py", line 420, in _instantiate
app = cls(*args, **kwargs)
File "/home/karthik/Projects/ryu/ryu/app/simple_switch.py", line 36, in __init__
s_list = ryu.topology.api.get_all_switch(app_manager.RyuApp)
File "/usr/local/lib/python2.7/dist-packages/ryu/topology/api.py", line 26, in get_all_switch
return get_switch(app)
File "/usr/local/lib/python2.7/dist-packages/ryu/topology/api.py", line 21, in get_switch
rep = app.send_request(event.EventSwitchRequest(dpid))
TypeError: unbound method send_request() must be called with RyuApp instance as first argument (got EventSwitchRequest instance instead)
在上面的問題中增加了導入行 – liv2hak
因此,不會導入'ryu.topology.api',這就是NameError的原因。嘗試'導入ryu.topology.api'並在'__init __()'中調用'ryu.topology.api.get_all_switch()'。 – user58697
我已經嘗試了你的建議。我現在得到一個新的錯誤。confusing :( – liv2hak