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.
If so, can it be dued to the format of the path: maybe the side of the "/" should be more exploitabled in the other side "" ? And that could explain why it's read as string? I've noticed when I select an existing folder, the path is write in this side "" using QFileDialog.getExistingDirectory. At contrary when I write a path for a file that doesn't exist it can be saved with "/".
– zlikotp Dec 20 '19 at 11:22run,runandload, etc.) gives directly the reference of output layer returned by a processing tool. All options return mostly file path (as string) except option 1. Only option 1 returns (programmatically) reference/instance/pointer of output layer in memory. – Kadir Şahbaz Dec 20 '19 at 11:57runmay return another reference of the output. – Kadir Şahbaz Dec 19 '21 at 07:34