1

I run Python processing algorithms externally, and I want to get the log output I see when I run it from the QGIS 3 GUI at the log tab as shown in the screenshot:

enter image description here

I want to get the full grey log output when Result is returned only.

How do I do that?

An example follows:

import os
import sys
import gdal
gdal.UseExceptions()  # Allow GDAL to throw Python Exceptions

from qgis.core import (
    QgsApplication,
    QgsProcessingFeedback,
    QgsMessageLog)

from qgis.analysis import QgsNativeAlgorithms

QgsApplication.setPrefixPath(os.path.join("C:", os.sep, "OSGeo4W64", "apps", "qgis"), True)
qgs = QgsApplication([], False)
qgs.initQgis()

sys.path.append(os.path.join("C:", os.sep, "OSGeo4W64", "apps", "qgis", "python", "plugins"))
import processing
from processing.core.Processing import Processing

Processing.initialize()
QgsApplication.processingRegistry().addProvider(QgsNativeAlgorithms())


def pca(input_raster_list):

    params = {
                'input': input_raster_list,
                'rescale': [0,0],
                'percent': 99,
                '-n': True,
                '-f': False,
                'output': 'C:\\Users\\...',
                'GRASS_REGION_PARAMETER': None,
                'GRASS_REGION_CELLSIZE_PARAMETER': 0
                }
    feedback = QgsProcessingFeedback()
    res = processing.run("grass7:i.pca", params, feedback=feedback)
    print(res)

    return
  • 1
    Can you post a small code sample showing how you are calling the algorithms? – ndawson Feb 1 at 18:57
  • Can the question be reopened now that more detail and specifications are included? It was supposed to be a generic question on how to get the logs from QGIS, but maybe now it is more clear. – ODstuck Feb 3 at 21:04
  • 1
    Even "generic" questions about code should always include a code snippet that illustrates what you have tried and where you are stuck. – PolyGeo Feb 3 at 21:38
1

You can subclass QgsProcessingFeedback to implement your own custom logging logic. E.g.

class MyFeedBack(QgsProcessingFeedback):

    def setProgressText(self, text):
        print(text)

    def pushInfo(self, info):
        print(info)

    def pushCommandInfo(self, info):
        print(info)

    def pushDebugInfo(self, info):
        print(info)

    def pushConsoleInfo(self, info):
        print(info)

    def reportError(self, error, fatalError=False):
        print(error)

This one will just print everything to the console, but you could modify the logic to write to a file, etc.

Then, whenever you call processing.run, make sure you pass an instance of your subclass as the feedback argument:

res = processing.run("grass7:i.pca", params, feedback=MyFeedBack())
  • Thank you once more Nyall! You are right that code is needed and necessary for any help. The solution is helpful and insightful. – ODstuck Feb 4 at 15:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.