Please note that all solutions explained here are related to vector layer used as the input and QGIS native algorithms. The answer doesn't explain the results of other providers' tools. (GRASS, GDAL, SAGA, ...). They may be different from native ones.
QGIS 3:
OPTION 1: run()
method with memory output:
result = processing.run("native:buffer",
{'INPUT':'D:/foo/bar.shp',
...
'OUTPUT':'TEMPORARY_OUTPUT'
})
# OUTPUT
#`result = {'OUTPUT': <qgis._core.QgsVectorLayer object at 0x00...>}`
Result is a dictionary. result['OUTPUT']
gives an instance of a layer (QgsVectorLayer
). No layer is added. Option 1 is one and only solution that returns a reference for QgsVectorLayer
in QGIS 3.
It can be used in the following way:
result_layer = processing.run("alg_name", {..., "OUTPUT":'TEMPORARY_OUTPUT'})["OUTPUT"]
result_layer
is now qgis._core.QgsVectorLayer
. Since it's a memory layer, it should be added to the project using addMapLayer()
method.
Other Processing Options
OPTION 2: run()
method with file output:
result = processing.run("native:buffer",
{'INPUT':'D:/foo/bar.shp',
...
'OUTPUT':'c:/foo/baz.shp'})
# OUTPUT
# `result = {'OUTPUT': 'c:/foo/baz.shp'}`
Result is a dictionary, value is a string. No layer is added.
OPTION 3: runAndLoadResults()
method with file output
result = processing.runAndLoadResults("native:buffer",
{'INPUT':'D:/foo/bar.shp',
...
'OUTPUT':'c:/foo/baz.shp'})
# OUTPUT
# `result = {'OUTPUT': 'c:/foo/baz.shp'}`
Result is a dictionary, value is a string. A layer is added.
OPTION 4: runAndLoadResults()
method with memory output
result = processing.runAndLoadResults("native:buffer",
{'INPUT':'D:/foo/bar.shp',
...
'OUTPUT':'TEMPORARY_OUTPUT'
})
# OUTPUT
# `result = {'OUTPUT': 'buffer_0ae....'}`
Result is a dictionary, value is a string. A layer is added.
QGIS 2: (Old version)
OPTION 1: runandload()
method with file output
result = processing.runandload("qgis:fixeddistancebuffer",
"c:/foo/bar.shp", 10, 5, False,
"c:/foo/baz.shp")
# OUTPUT
# `result = <*****.FixedDistanceBuffer instance at 0x00...>`
Result is an instance of related algorithm class. A layer is added.
OPTION 2: runandload()
method with memory output
result = processing.runandload("qgis:fixeddistancebuffer",
"c:/foo/bar.shp", 10, 5, False,
"memory:mem_layer")
# OUTPUT
# `result = <*****.FixedDistanceBuffer instance at 0x00...>`
Result is an instance of related algorithm class. A layer is added.
OPTION 3: runalg()
method with file output
result = processing.runalg("qgis:fixeddistancebuffer",
"c:/foo/bar.shp", 10, 5, False,
"c:/foo/baz.shp")
# OUTPUT
# `result = {'OUTPUT': "c:/foo/baz.shp"}`
Result is a dictionary, value is a string. No layer is added.
OPTION 4: runalg()
method with memory output
result = processing.runalg("qgis:fixeddistancebuffer",
"c:/foo/bar.shp", 10, 5, False,
"memory:mem_layer")
# OUTPUT
# `result = {'OUTPUT': "memory:mem_layer"}`
Result is a dictionary, value is a string. No layer is added.
Neither runalg
nor runandload
returns a layer reference/instance for output in QGIS 2.