summaryrefslogtreecommitdiff
path: root/qutebrowser/extensions/loader.py
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2018-12-10 11:19:37 +0100
committerFlorian Bruhin <me@the-compiler.org>2018-12-10 12:37:58 +0100
commit6bc771151fc7f6b67fb996697cec4443d467d0e8 (patch)
tree9efba015b5357464212546e895507e8078c7c826 /qutebrowser/extensions/loader.py
parent15e9127fa08c0348aae4fdcc3080f55110a16615 (diff)
downloadqutebrowser-6bc771151fc7f6b67fb996697cec4443d467d0e8.tar.gz
qutebrowser-6bc771151fc7f6b67fb996697cec4443d467d0e8.zip
Make walking components work for PyInstaller
Closes https://github.com/qutebrowser/qutebrowser-extensions/issues/5
Diffstat (limited to 'qutebrowser/extensions/loader.py')
-rw-r--r--qutebrowser/extensions/loader.py33
1 files changed, 27 insertions, 6 deletions
diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py
index d6fdc675e..d7f9b2533 100644
--- a/qutebrowser/extensions/loader.py
+++ b/qutebrowser/extensions/loader.py
@@ -23,6 +23,7 @@ import importlib.abc
import pkgutil
import types
import typing
+import sys
import attr
@@ -34,7 +35,6 @@ from qutebrowser.utils import log
class ComponentInfo:
name = attr.ib() # type: str
- finder = attr.ib() # type: importlib.abc.PathEntryFinder
def load_components() -> None:
@@ -45,14 +45,35 @@ def load_components() -> None:
def walk_components() -> typing.Iterator[ComponentInfo]:
"""Yield ComponentInfo objects for all modules."""
- for finder, name, ispkg in pkgutil.walk_packages(components.__path__):
+ if hasattr(sys, 'frozen'):
+ yield from _walk_pyinstaller()
+ else:
+ yield from _walk_normal()
+
+
+def _walk_normal() -> typing.Iterator[ComponentInfo]:
+ """Walk extensions when not using PyInstaller."""
+ for _finder, name, ispkg in pkgutil.walk_packages(components.__path__):
if ispkg:
continue
- yield ComponentInfo(name=name, finder=finder)
+ fullname = components.__name__ + '.' + name
+ yield ComponentInfo(name=fullname)
+
+
+def _walk_pyinstaller() -> typing.Iterator[ComponentInfo]:
+ """Walk extensions when using PyInstaller.
+
+ See https://github.com/pyinstaller/pyinstaller/issues/1905
+ """
+ toc = set()
+ for importer in pkgutil.iter_importers('qutebrowser'):
+ if hasattr(importer, 'toc'):
+ toc |= importer.toc
+ for name in toc:
+ if name.startswith(components.__name__ + '.'):
+ yield ComponentInfo(name=name)
def _load_component(info: ComponentInfo) -> types.ModuleType:
log.extensions.debug("Importing {}".format(info.name))
- loader = info.finder.find_module(info.name)
- assert loader is not None
- return loader.load_module(info.name)
+ return importlib.import_module(info.name)