X-Git-Url: http://git.onelab.eu/?p=monitor.git;a=blobdiff_plain;f=monitor%2FRpyc%2FModuleNetProxy.py;fp=monitor%2FRpyc%2FModuleNetProxy.py;h=344508825f6f455d46147d55d9516c91aced0e47;hp=0000000000000000000000000000000000000000;hb=334378a14103c3fd02332b6ce3767553f1fe11d2;hpb=486326759a86f1315d93aeaccf6e2641af2bd9d9 diff --git a/monitor/Rpyc/ModuleNetProxy.py b/monitor/Rpyc/ModuleNetProxy.py new file mode 100644 index 0000000..3445088 --- /dev/null +++ b/monitor/Rpyc/ModuleNetProxy.py @@ -0,0 +1,46 @@ +from NetProxy import NetProxyWrapper + + +class ModuleNetProxy(NetProxyWrapper): + """a netproxy specialzied for exposing remote modules (first tries to getattr, + if it fails tries to import)""" + __doc__ = NetProxyWrapper.__doc__ + + def __init__(self, proxy, base): + NetProxyWrapper.__init__(self, proxy) + self.__dict__["____base"] = base + self.__dict__["____cache"] = {} + + def __request__(self, handler, *args): + return self.__dict__["____conn"].sync_request(handler, self.__dict__["____oid"], *args) + + def __getattr__(self, name): + if name in self.__dict__["____cache"]: + return self.__dict__["____cache"][name] + + try: + return self.__request__("handle_getattr", name) + except AttributeError: + pass + + try: + fullname = self.__dict__["____base"] + "." + name + obj = self.__dict__["____conn"].rimport(fullname) + module = ModuleNetProxy(obj, fullname) + self.__dict__["____cache"][name] = module + return module + except ImportError: + raise AttributeError("'module' object has not attribute or submodule %r" % (name,)) + +class RootImporter(object): + """the root of the interpreter's import hierarchy""" + + def __init__(self, conn): + self.__dict__["____conn"] = conn + + def __getitem__(self, name): + return self.__dict__["____conn"].rimport(name) + + def __getattr__(self, name): + return ModuleNetProxy(self[name], name) +