Hello, I took a closer look at the issue and I think I might have a fix. The attached patchset fixes the computation of app dependencies under Python 3.x.
The first patch modifies require_app to handle the case where inspect.getmodule returns None under Python 3.x; None values are filtered in order to simulate the Python 2.x behavior. The second patch modifies get_dependent_services by extending the member predicate with an additional isfunction() check, as python 3.x does not distinguish between bound/unbound methods. Greetings from Germany, -Fadi -- ryu/base/app_manager.py | 7 ++++--- ryu/controller/handler.py | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ryu/base/app_manager.py b/ryu/base/app_manager.py index 340d31a..7f4057d 100644 --- a/ryu/base/app_manager.py +++ b/ryu/base/app_manager.py @@ -77,11 +77,12 @@ def require_app(app_name, api_style=False): If this is used for client application module, set api_style=False. """ + moduleiter = (inspect.getmodule(frame[0]) for frame in inspect.stack()) + modulestack = [module for module in moduleiter if module is not None] if api_style: - frm = inspect.stack()[2] # skip a frame for "api" module + m = modulestack[2] # skip a frame for "api" module else: - frm = inspect.stack()[1] - m = inspect.getmodule(frm[0]) # client module + m = modulestack[1] m._REQUIRED_APP = getattr(m, '_REQUIRED_APP', []) m._REQUIRED_APP.append(app_name) LOG.debug('require_app: %s is required by %s', app_name, m.__name__) diff --git a/ryu/controller/handler.py b/ryu/controller/handler.py index b3d40ae..4b97e59 100644 --- a/ryu/controller/handler.py +++ b/ryu/controller/handler.py @@ -85,10 +85,12 @@ def register_instance(i): for ev_cls, c in m.callers.items(): i.register_handler(ev_cls, m) +def _is_method(f): + return inspect.isfunction(f) or inspect.ismethod(f) def get_dependent_services(cls): services = [] - for _k, m in inspect.getmembers(cls, inspect.ismethod): + for _k, m in inspect.getmembers(cls, _is_method): if _has_caller(m): for ev_cls, c in m.callers.items(): service = getattr(sys.modules[ev_cls.__module__], 2015-07-30 23:32 GMT+02:00 FUJITA Tomonori <fujita.tomon...@lab.ntt.co.jp>: > Hi, > > The framework supports py3. But some of examples under "app" directory > aren't ready. > > On Thu, 30 Jul 2015 14:50:54 +0200 > Fadi Moukayed <smf...@gmail.com> wrote: > >> Hello, >> >> While reading the Ryu book, I discovered that several applications in >> ryu.app.* seem to be broken under Python 3: >> >> test@host:~# ryu-manager --verbose ryu.app.rest_topology >> loading app ryu.app.rest_topology >> Traceback (most recent call last): >> File "/usr/local/lib/python3.4/dist-packages/ryu/utils.py", line 81, in >> import_module >> __import__(modname) >> File "/usr/local/lib/python3.4/dist-packages/ryu/app/rest_topology.py", >> line 22, in <module> >> from ryu.topology.api import get_switch, get_link >> File "/usr/local/lib/python3.4/dist-packages/ryu/topology/api.py", line >> 38, in <module> >> app_manager.require_app('ryu.topology.switches', api_style=True) >> File "/usr/local/lib/python3.4/dist-packages/ryu/base/app_manager.py", >> line 85, in require_app >> m._REQUIRED_APP = getattr(m, '_REQUIRED_APP', []) >> AttributeError: 'NoneType' object has no attribute '_REQUIRED_APP' >> >> During handling of the above exception, another exception occurred: >> >> Traceback (most recent call last): >> File "/usr/local/bin/ryu-manager", line 9, in <module> >> load_entry_point('ryu==3.23.2', 'console_scripts', 'ryu-manager')() >> File "/usr/local/lib/python3.4/dist-packages/ryu/cmd/manager.py", line >> 88, in main >> app_mgr.load_apps(app_lists) >> File "/usr/local/lib/python3.4/dist-packages/ryu/base/app_manager.py", >> line 389, in load_apps >> cls = self.load_app(app_cls_name) >> File "/usr/local/lib/python3.4/dist-packages/ryu/base/app_manager.py", >> line 366, in load_app >> mod = utils.import_module(name) >> File "/usr/local/lib/python3.4/dist-packages/ryu/utils.py", line 92, in >> import_module >> __import__(name) >> File "/usr/local/lib/python3.4/dist-packages/ryu/app/rest_topology.py", >> line 22, in <module> >> from ryu.topology.api import get_switch, get_link >> File "/usr/local/lib/python3.4/dist-packages/ryu/topology/api.py", line >> 38, in <module> >> app_manager.require_app('ryu.topology.switches', api_style=True) >> File "/usr/local/lib/python3.4/dist-packages/ryu/base/app_manager.py", >> line 85, in require_app >> m._REQUIRED_APP = getattr(m, '_REQUIRED_APP', []) >> AttributeError: 'NoneType' object has no attribute '_REQUIRED_APP' >> >> The above happens with Ryu 3.23.2 from PyPI on Python 3.4.0 (Ubuntu 14.04) >> >> Additionally, I also saw the following error messages during install (Seems >> like some files were missed during the 2->3 conversion): >> >> Installing collected packages: ryu >> Running setup.py install for ryu >> [pbr] Reusing existing SOURCES.txt >> Installing ryu script to /usr/local/bin >> Installing ryu-manager script to /usr/local/bin >> File >> "/usr/local/lib/python3.4/dist-packages/ryu/contrib/ovs/db/idl.py", line 189 >> except error.Error, e: >> ^ >> SyntaxError: invalid syntax >> >> File >> "/usr/local/lib/python3.4/dist-packages/ryu/contrib/ovs/stream.py", line 122 >> def open_block((error, stream)): >> ^ >> SyntaxError: invalid syntax >> >> File >> "/usr/local/lib/python3.4/dist-packages/ryu/contrib/ovs/fatal_signal.py", >> line 93 >> except OSError, e: >> ^ >> SyntaxError: invalid syntax >> >> File >> "/usr/local/lib/python3.4/dist-packages/ryu/contrib/ovs/daemon.py", line 147 >> except IOError, e: >> ^ >> SyntaxError: invalid syntax >> >> File >> "/usr/local/lib/python3.4/dist-packages/ryu/contrib/ovs/poller.py", line 174 >> except select.error, e: >> ^ >> SyntaxError: invalid syntax >> >> File >> "/usr/local/lib/python3.4/dist-packages/ryu/contrib/ovs/socket_util.py", >> line 40 >> except socket.error, e: >> ^ >> SyntaxError: invalid syntax >> >> File >> "/usr/local/lib/python3.4/dist-packages/ryu/contrib/ovs/json.py", line 146 >> except UnicodeDecodeError, e: >> ^ >> SyntaxError: invalid syntax >> >> File >> "/usr/local/lib/python3.4/dist-packages/ryu/contrib/ovs/ovsuuid.py", line 45 >> except error.Error, e: >> ^ >> SyntaxError: invalid syntax >> >> Successfully installed ryu >> Cleaning up... >> test@host:~$ >> >> Note that other example applications such as simple_vlan and rest_qos are >> affected by this, since they depend on the contrib.ovs modules. >> >> Greetings from Germany, >> -Fadi ------------------------------------------------------------------------------ _______________________________________________ Ryu-devel mailing list Ryu-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ryu-devel