diff --git a/python/plugins/grassprovider/Grass7Algorithm.py b/python/plugins/grassprovider/Grass7Algorithm.py index edf5d4bcb9c..f0ba39ad823 100644 --- a/python/plugins/grassprovider/Grass7Algorithm.py +++ b/python/plugins/grassprovider/Grass7Algorithm.py @@ -25,6 +25,7 @@ import re import uuid import math import importlib +from pathlib import Path from qgis.PyQt.QtCore import QCoreApplication, QUrl @@ -139,11 +140,16 @@ class Grass7Algorithm(QgsProcessingAlgorithm): # Use the ext mechanism name = self.name().replace('.', '_') + self.module = None try: - self.module = importlib.import_module( - 'grassprovider.ext.{}'.format(name)) - except ImportError: - self.module = None + extpath = Path(self.descriptionFile).parents[1].joinpath('ext', name + '.py') + # this check makes it a bit faster + if extpath.exists(): + spec = importlib.util.spec_from_file_location('grassprovider.ext.' + name, extpath) + self.module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(self.module) + except: + pass def createInstance(self): return self.__class__(self.descriptionFile) diff --git a/python/plugins/grassprovider/Grass7AlgorithmProvider.py b/python/plugins/grassprovider/Grass7AlgorithmProvider.py index b709ca1556e..b6020f79af3 100644 --- a/python/plugins/grassprovider/Grass7AlgorithmProvider.py +++ b/python/plugins/grassprovider/Grass7AlgorithmProvider.py @@ -31,11 +31,12 @@ from qgis.core import (Qgis, from processing.core.ProcessingConfig import (ProcessingConfig, Setting) from grassprovider.Grass7Utils import Grass7Utils from grassprovider.Grass7Algorithm import Grass7Algorithm -from processing.tools.system import isWindows, isMac +from processing.tools.system import isWindows, isMac, mkdir class Grass7AlgorithmProvider(QgsProcessingProvider): - descriptionFolder = Grass7Utils.grassDescriptionPath() + descriptionFolders = Grass7Utils.grassDescriptionFolders() + mkdir(descriptionFolders[0]) def __init__(self): super().__init__() @@ -85,18 +86,19 @@ class Grass7AlgorithmProvider(QgsProcessingProvider): def createAlgsList(self): algs = [] - folder = self.descriptionFolder - for descriptionFile in os.listdir(folder): - if descriptionFile.endswith('txt'): - try: - alg = Grass7Algorithm(os.path.join(folder, descriptionFile)) - if alg.name().strip() != '': - algs.append(alg) - else: - QgsMessageLog.logMessage(self.tr('Could not open GRASS GIS 7 algorithm: {0}').format(descriptionFile), self.tr('Processing'), Qgis.Critical) - except Exception as e: - QgsMessageLog.logMessage( - self.tr('Could not open GRASS GIS 7 algorithm: {0}\n{1}').format(descriptionFile, str(e)), self.tr('Processing'), Qgis.Critical) + folders = self.descriptionFolders + for folder in folders: + for descriptionFile in os.listdir(folder): + if descriptionFile.endswith('txt'): + try: + alg = Grass7Algorithm(os.path.join(folder, descriptionFile)) + if alg.name().strip() != '': + algs.append(alg) + else: + QgsMessageLog.logMessage(self.tr('Could not open GRASS GIS 7 algorithm: {0}').format(descriptionFile), self.tr('Processing'), Qgis.Critical) + except Exception as e: + QgsMessageLog.logMessage( + self.tr('Could not open GRASS GIS 7 algorithm: {0}\n{1}').format(descriptionFile, str(e)), self.tr('Processing'), Qgis.Critical) return algs def loadAlgorithms(self): diff --git a/python/plugins/grassprovider/Grass7Utils.py b/python/plugins/grassprovider/Grass7Utils.py index 332919c25c1..715e4ab9764 100644 --- a/python/plugins/grassprovider/Grass7Utils.py +++ b/python/plugins/grassprovider/Grass7Utils.py @@ -254,8 +254,8 @@ class Grass7Utils: return folder or '' @staticmethod - def grassDescriptionPath(): - return os.path.join(os.path.dirname(__file__), 'description') + def grassDescriptionFolders(): + return [ os.path.join(userFolder(), 'grassaddons', 'description'), os.path.join(os.path.dirname(__file__), 'description')] @staticmethod def getWindowsCodePage():