9

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
PolyGeo
  • 65,136
  • 29
  • 109
  • 338
ODstuck
  • 651
  • 6
  • 17
  • 1
    Can you post a small code sample showing how you are calling the algorithms? – ndawson Feb 01 '19 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 03 '19 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 03 '19 at 21:38

1 Answers1

11

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())
Kadir Şahbaz
  • 76,800
  • 56
  • 247
  • 389
ndawson
  • 27,620
  • 3
  • 61
  • 85
  • 2
    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 04 '19 at 15:14