From f3cf12b0e8d4584786980db602f9c57829687d8d Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 3 Jun 2019 18:41:28 -0400 Subject: [PATCH 1/8] servermanager: simplify find_module implementation --- Wrapping/Python/paraview/servermanager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Wrapping/Python/paraview/servermanager.py b/Wrapping/Python/paraview/servermanager.py index 445822e155..924ad1aed8 100644 --- a/Wrapping/Python/paraview/servermanager.py +++ b/Wrapping/Python/paraview/servermanager.py @@ -2249,8 +2249,8 @@ class _ModuleLoader(object): def find_module(self, fullname, path=None): if vtkPVPythonModule.HasModule(fullname): return self - else: - return None + return None + def load_module(self, fullname): import imp moduleInfo = vtkPVPythonModule.GetModule(fullname) -- GitLab From 2e72189e5bd1787b024792a312f8e464e7218c48 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 3 Jun 2019 18:41:55 -0400 Subject: [PATCH 2/8] servermanager: use the module cache first --- Wrapping/Python/paraview/servermanager.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Wrapping/Python/paraview/servermanager.py b/Wrapping/Python/paraview/servermanager.py index 924ad1aed8..d91e6afd59 100644 --- a/Wrapping/Python/paraview/servermanager.py +++ b/Wrapping/Python/paraview/servermanager.py @@ -2252,6 +2252,11 @@ class _ModuleLoader(object): return None def load_module(self, fullname): + try: + return sys.modules[fullname] + except KeyError: + pass + import imp moduleInfo = vtkPVPythonModule.GetModule(fullname) if not moduleInfo: -- GitLab From e5e4f85e1f656b0ad572c5ddd94d39fe2a46305c Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 3 Jun 2019 18:43:16 -0400 Subject: [PATCH 3/8] servermanager: call the GetIsPackage() method --- Wrapping/Python/paraview/servermanager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Wrapping/Python/paraview/servermanager.py b/Wrapping/Python/paraview/servermanager.py index d91e6afd59..73d0826975 100644 --- a/Wrapping/Python/paraview/servermanager.py +++ b/Wrapping/Python/paraview/servermanager.py @@ -2264,7 +2264,7 @@ class _ModuleLoader(object): module = sys.modules.setdefault(fullname, imp.new_module(fullname)) module.__file__ = "<%s>" % moduleInfo.GetFullName() module.__loader__ = self - if moduleInfo.GetIsPackage: + if moduleInfo.GetIsPackage(): module.__path__ = moduleInfo.GetFullName() code = compile(moduleInfo.GetSource(), module.__file__, 'exec') exec (code in module.__dict__) -- GitLab From 57b424f26d9b1b024e9c4dffbbbdfd90cb080fd1 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 3 Jun 2019 18:43:53 -0400 Subject: [PATCH 4/8] servermanager: execute the source properly There's no need to compile ahead of time, but we do need to pass the `module.__dict__` as a separate argument. --- Wrapping/Python/paraview/servermanager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Wrapping/Python/paraview/servermanager.py b/Wrapping/Python/paraview/servermanager.py index 73d0826975..3adc2e7a25 100644 --- a/Wrapping/Python/paraview/servermanager.py +++ b/Wrapping/Python/paraview/servermanager.py @@ -2266,8 +2266,7 @@ class _ModuleLoader(object): module.__loader__ = self if moduleInfo.GetIsPackage(): module.__path__ = moduleInfo.GetFullName() - code = compile(moduleInfo.GetSource(), module.__file__, 'exec') - exec (code in module.__dict__) + exec(moduleInfo.GetSource(), module.__dict__) return module def LoadXML(xmlstring): -- GitLab From 55c861bd53635e333014182307f60e749e4099a2 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 3 Jun 2019 18:45:40 -0400 Subject: [PATCH 5/8] servermanager: remove invalid modules from sys.modules --- Wrapping/Python/paraview/servermanager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Wrapping/Python/paraview/servermanager.py b/Wrapping/Python/paraview/servermanager.py index 3adc2e7a25..9d6c468e4f 100644 --- a/Wrapping/Python/paraview/servermanager.py +++ b/Wrapping/Python/paraview/servermanager.py @@ -2266,7 +2266,11 @@ class _ModuleLoader(object): module.__loader__ = self if moduleInfo.GetIsPackage(): module.__path__ = moduleInfo.GetFullName() - exec(moduleInfo.GetSource(), module.__dict__) + try: + exec(moduleInfo.GetSource(), module.__dict__) + except: + del sys.modules[fullname] + raise return module def LoadXML(xmlstring): -- GitLab From 9e2adfc5cf057bda1afce2de3182ed09d0110094 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 3 Jun 2019 18:46:02 -0400 Subject: [PATCH 6/8] servermanager: clean up module loading code --- Wrapping/Python/paraview/servermanager.py | 28 ++++++++++++++--------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Wrapping/Python/paraview/servermanager.py b/Wrapping/Python/paraview/servermanager.py index 9d6c468e4f..69298c1444 100644 --- a/Wrapping/Python/paraview/servermanager.py +++ b/Wrapping/Python/paraview/servermanager.py @@ -2245,7 +2245,7 @@ def CreateRepresentation(aProxy, view, **extraArgs): view.Representations.append(proxy) return proxy -class _ModuleLoader(object): +class ParaViewMetaPathFinder(object): def find_module(self, fullname, path=None): if vtkPVPythonModule.HasModule(fullname): return self @@ -2257,17 +2257,23 @@ class _ModuleLoader(object): except KeyError: pass - import imp - moduleInfo = vtkPVPythonModule.GetModule(fullname) - if not moduleInfo: + info = vtkPVPythonModule.GetModule(fullname) + if not info: raise ImportError - module = sys.modules.setdefault(fullname, imp.new_module(fullname)) - module.__file__ = "<%s>" % moduleInfo.GetFullName() + + import imp + module = imp.new_module(fullname) + module.__file__ = "<%s>" % fullname module.__loader__ = self - if moduleInfo.GetIsPackage(): - module.__path__ = moduleInfo.GetFullName() + if info.GetIsPackage(): + module.__path__ = [] + module.__package__ = fullname + else: + module.__package__ = fullname.rpartition('.')[0] + + sys.modules[fullname] = module try: - exec(moduleInfo.GetSource(), module.__dict__) + exec(info.GetSource(), module.__dict__) except: del sys.modules[fullname] raise @@ -3202,8 +3208,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 -- GitLab From 0cf25599f1faa92184ab91203a831c6fb0969378 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 3 Jun 2019 18:40:52 -0400 Subject: [PATCH 7/8] servermanager: support Python3's API for dynamic modules --- Wrapping/Python/paraview/servermanager.py | 85 +++++++++++++++-------- 1 file changed, 55 insertions(+), 30 deletions(-) diff --git a/Wrapping/Python/paraview/servermanager.py b/Wrapping/Python/paraview/servermanager.py index 69298c1444..5e27605861 100644 --- a/Wrapping/Python/paraview/servermanager.py +++ b/Wrapping/Python/paraview/servermanager.py @@ -2245,39 +2245,64 @@ def CreateRepresentation(aProxy, view, **extraArgs): view.Representations.append(proxy) return proxy -class ParaViewMetaPathFinder(object): - def find_module(self, fullname, path=None): - if vtkPVPythonModule.HasModule(fullname): - return self - return None +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): - try: - return sys.modules[fullname] - except KeyError: - pass + 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] + 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 + 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.""" -- GitLab From 69219de03294edd17d1a2da3f852b6f98082d173 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 3 Jun 2019 18:54:18 -0400 Subject: [PATCH 8/8] ParaViewPlugin: remove old comment --- CMake/ParaViewPlugin.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/CMake/ParaViewPlugin.cmake b/CMake/ParaViewPlugin.cmake index 18dfb6a90b..e3eaa0f905 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") -- GitLab