diff --git a/CMake/ParaViewPlugin.cmake b/CMake/ParaViewPlugin.cmake index 18dfb6a90b2bd828552d38cda3b872907575124f..e3eaa0f905ee5231c3ab7f03b6b653fab8ed8551 100644 --- a/CMake/ParaViewPlugin.cmake +++ b/CMake/ParaViewPlugin.cmake @@ -620,7 +620,6 @@ function (paraview_add_plugin name) endif () # TODO: resource initialization for static builds - # WITH_PYTHON if (_paraview_add_plugin_REQUIRED_ON_SERVER) set(_paraview_add_plugin_required_on_server "true") diff --git a/Wrapping/Python/paraview/servermanager.py b/Wrapping/Python/paraview/servermanager.py index 445822e155aa0bb72d735da808e554b0ff03e253..5e276058612ab52c407aa9de0e4887c8b66877b8 100644 --- a/Wrapping/Python/paraview/servermanager.py +++ b/Wrapping/Python/paraview/servermanager.py @@ -2245,25 +2245,64 @@ def CreateRepresentation(aProxy, view, **extraArgs): view.Representations.append(proxy) return proxy -class _ModuleLoader(object): - def find_module(self, fullname, path=None): - if vtkPVPythonModule.HasModule(fullname): - return self - else: +if sys.version_info < (3, 3): + class ParaViewMetaPathFinder(object): + def find_module(self, fullname, path=None): + if vtkPVPythonModule.HasModule(fullname): + return self return None - def load_module(self, fullname): - import imp - moduleInfo = vtkPVPythonModule.GetModule(fullname) - if not moduleInfo: - raise ImportError - module = sys.modules.setdefault(fullname, imp.new_module(fullname)) - module.__file__ = "<%s>" % moduleInfo.GetFullName() - module.__loader__ = self - if moduleInfo.GetIsPackage: - module.__path__ = moduleInfo.GetFullName() - code = compile(moduleInfo.GetSource(), module.__file__, 'exec') - exec (code in module.__dict__) - return module + + def load_module(self, fullname): + try: + return sys.modules[fullname] + except KeyError: + pass + + info = vtkPVPythonModule.GetModule(fullname) + if not info: + raise ImportError + + import imp + module = imp.new_module(fullname) + module.__file__ = "<%s>" % fullname + module.__loader__ = self + if info.GetIsPackage(): + module.__path__ = [] + module.__package__ = fullname + else: + module.__package__ = fullname.rpartition('.')[0] + + sys.modules[fullname] = module + try: + exec(info.GetSource(), module.__dict__) + except: + del sys.modules[fullname] + raise + return module +else: + import importlib + class ParaViewMetaPathFinder(importlib.abc.MetaPathFinder): + def __init__(self): + self._loader = ParaViewLoader() + + def find_spec(self, fullname, path, target=None): + info = vtkPVPythonModule.GetModule(fullname) + if info: + package = None + if info.GetIsPackage(): + package = fullname + return importlib.machinery.ModuleSpec(fullname, self._loader, is_package=package) + return None + + class ParaViewLoader(importlib.abc.InspectLoader): + def _info(self, fullname): + return vtkPVPythonModule.GetModule(fullname) + + def is_package(self, fullname): + return self._info(fullname).GetIsPackage() + + def get_source(self, fullname): + return self._info(fullname).GetSource() def LoadXML(xmlstring): """DEPRECATED. Given a server manager XML as a string, parse and process it.""" @@ -3194,8 +3233,8 @@ _pyproxies = {} # _createModules() # Set up our custom importer (if possible) -loader = _ModuleLoader() -sys.meta_path.append(loader) +finder = ParaViewMetaPathFinder() +sys.meta_path.append(finder) def __exposeActiveModules__(): """Update servermanager submodules to point to the current