With QGIS 3.22 the GRASS algorithms got its own provider (grassprovider.Grass7AlgorithmProvider
) and are no more part of processing.algs
. Knowing this, in a standalone pyqgis-script I am trying to add the GRASS algs to the processingRegistry
with QgsApplication.processingRegistry().addProvider(Grass7AlgorithmProvider())
.
If I am now trying to run a GRASS alg, e.g. processing.run("grass7:v.dissolve", ...)
I get
_core.QgsProcessingException: Error: Algorithm grass7:v.dissolve not found
When I then list all the registered algs
for alg in QgsApplication.processingRegistry().algorithms():
print("{}:{} --> {}".format(alg.provider().name(), alg.name(), alg.displayName()))
I get (after the entries of GDAL algs) a list of blank entries:
: -->
: -->
: -->
: -->
...
Obviously the GRASS algs are registered, but with no provider name and with no alg name resulting that I can't call the algs.
Is there anything I am doing wrong or I s it a bug?
-
1This is a bug according to github.com/qgis/QGIS/issues/459359ls1– 9ls12021年11月29日 09:25:10 +00:00Commented Nov 29, 2021 at 9:25
1 Answer 1
My current setup for the Windows command line:
call "C:\Program Files\QGIS 3.36.1\OSGeo4W.bat"
call "C:\Program Files\QGIS 3.36.1\bin\python-grass83.bat" -c ""
call "C:\Program Files\QGIS 3.36.1\bin\python-qgis.bat" -c ""
python file.py
Content of file.py:
import os
import sys
qgis_root_path = r"C:\Program Files\QGIS 3.36.1"
sys.path.append(os.path.join(qgis_root_path, "apps\qgis\python\plugins"))
from qgis.core import *
QgsApplication.setPrefixPath(qgis_root_path, True)
qgs = QgsApplication([], False)
qgs.initQgis()
import processing
from processing.core.Processing import Processing
Processing.initialize()
for alg in QgsApplication.processingRegistry().algorithms():
if (alg.id().startswith("grass")):
print(alg.id(), "->", alg.displayName())
# processing.run("grass:<algorithm.name>", {})
qgs.exitQgis()
Output:
grass:g.extension.list -> g.extension.list
grass:g.extension.manage -> g.extension.manage
grass:g.version -> g.version
...