diff options
author | Justin Mayer <entroP@gmail.com> | 2020-04-17 20:21:25 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-17 20:21:25 +0200 |
commit | 59462ad415ba7f2bcad7d6093c6c22895a1d0e41 (patch) | |
tree | a91dc6c2ca02c538c5957b052c008c47249ff24f | |
parent | f610801ee8c67df5ed7e3223fe54a2578347b88e (diff) | |
parent | 46e1ec4f99be225d3f6f487de02832b97a26bc23 (diff) | |
download | pelican-59462ad415ba7f2bcad7d6093c6c22895a1d0e41.tar.gz |
Merge pull request #2730 from avaris/namespace-redux
Fix legacy plugin loading
-rw-r--r-- | pelican/plugins/_utils.py | 18 | ||||
-rw-r--r-- | pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py | 2 | ||||
-rw-r--r-- | pelican/tests/dummy_plugins/normal_plugin/normal_plugin/submodule.py | 2 |
3 files changed, 21 insertions, 1 deletions
diff --git a/pelican/plugins/_utils.py b/pelican/plugins/_utils.py index a3c9ee77..78c19e54 100644 --- a/pelican/plugins/_utils.py +++ b/pelican/plugins/_utils.py @@ -3,6 +3,7 @@ import importlib.machinery import importlib.util import logging import pkgutil +import sys logger = logging.getLogger(__name__) @@ -47,8 +48,23 @@ def load_legacy_plugin(plugin, plugin_paths): if spec is None: raise ImportError('Cannot import plugin `{}`'.format(plugin)) else: + # create module object from spec mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) + # place it into sys.modules cache + # necessary if module imports itself at some point (e.g. packages) + sys.modules[spec.name] = mod + try: + # try to execute it inside module object + spec.loader.exec_module(mod) + except Exception: # problem with import + try: + # remove module from sys.modules since it can't be loaded + del sys.modules[spec.name] + except KeyError: + pass + raise + + # if all went well, we have the plugin module return mod diff --git a/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py b/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py index 15896087..5838a835 100644 --- a/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py +++ b/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/__init__.py @@ -1,3 +1,5 @@ +from .submodule import noop # noqa: F401 + NAME = 'normal plugin' diff --git a/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/submodule.py b/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/submodule.py new file mode 100644 index 00000000..ba9c8f94 --- /dev/null +++ b/pelican/tests/dummy_plugins/normal_plugin/normal_plugin/submodule.py @@ -0,0 +1,2 @@ +def noop(): + pass |