Ich entwickle das RQGIS-Paket. Um QGIS in R auszuführen, rufe ich QGIS über die Befehlszeile auf. Dies funktionierte perfekt mit QGIS 2.14. Das Ausführen des gleichen Codes mit QGIS 2.16 führt jedoch zu einem Fehler. Folgendes mache ich:
Zuerst setze ich alle notwendigen Pfade in der Eingabeaufforderung:
@echo off
SET OSGEO4W_ROOT=D:\osgeo4w_qgis16
call "%OSGEO4W_ROOT%"\bin\o4w_env.bat
@echo off
path %PATH%;%OSGEO4W_ROOT%\apps\qgis\bin
set PYTHONPATH=%PYTHONPATH%;%OSGEO4W_ROOT%\apps\qgis\python;
set QGIS_PREFIX_PATH=%OSGEO4W_ROOT%\apps\qgis
rem open python
python.exe
Anschließend führe ich in Python folgende Zeilen aus:
import os
import sys
from qgis.core import *
import qgis.utils
from osgeo import ogr
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.gui import *
QgsApplication.setPrefixPath('D:\osgeo4w_qgis16\apps\qgis', True)
app = QgsApplication([], True)
QgsApplication.initQgis()
sys.path.append(r'D:\osgeo4w_qgis16\apps\qgis\python\plugins')
from processing.core.Processing import Processing
Processing.initialize()
import processing
processing.alglist()
processing.alghelp("grass7:v.voronoi")
Das funktioniert. Aufruf von process.runalg ...
from processing.tests.TestData import points
result = processing.runalg('grass7:v.voronoi', points(), False, False, '270778.60198,270855.745301,4458921.97814,4458983.8488', -1, 0.0001, 0, None,)
... erzeugt diese Fehlermeldung:
Error in sys.excepthook:
Traceback (most recent call last):
File "D:\osgeo4w_qgis16\apps\qgis\python\qgis\utils.py", line 196, in qgis_excepthook
showException(type, value, tb, None, messagebar=True)
File "D:\osgeo4w_qgis16\apps\qgis\python\qgis\utils.py", line 107, in showException
open_stack_dialog(type, value, tb, msg)
File "D:\osgeo4w_qgis16\apps\qgis\python\qgis\utils.py", line 142, in open_stack_dialog
iface.messageBar().popWidget()
AttributeError: 'NoneType' object has no attribute 'messageBar'
Original exception was:
Traceback (most recent call last):
File "<stdin>", line 10, in <module>
File "D:\osgeo4w_qgis16\apps\qgis\python\plugins\processing\tools\general.py", line 75, in runalg
alg = Processing.runAlgorithm(algOrName, None, *args, **kwargs)
File "D:\osgeo4w_qgis16\apps\qgis\python\plugins\processing\core\Processing.py", line 304, in runAlgorithm
ret = runalg(alg, progress)
File "D:\osgeo4w_qgis16\apps\qgis\python\plugins\processing\gui\AlgorithmExecutor.py", line 52, in runalg
progress.error(e.msg)
AttributeError: 'NoneType' object has no attribute 'error'
qgis
pyqgis
qgis-processing
Jannes
quelle
quelle
alg.execute(progress)
durchalg.execute(progress or SilentProgress())
in AlgorithmExecutor.py QGIS in einer benutzerdefinierten Anwendung zu verwenden. Das Problem ist noch schlimmer geworden, da jetzt keine Fehlermeldung mehr auftritt. Stattdessen gibt es sogar Erfolgsmeldungen (z. B. beim Ausführensaga:catchmentarearecursive
), nur die angegebenen Ausgabeordner bleiben leer. Ich würde mich sehr freuen, wenn Sie dieses Problem beheben könnten. Oder fehlt mir etwas?Barry, danke für deinen Rat. Anscheinend hat das QGIS-Kernteam den Code geändert. In QGIS 2.14
runalg
wurde wie folgt definiert:Wenn also der Fortschritt gleich ist
None
(was in meinem Beispielcode der Fall ist), haben SieSilentProgress
sich darum gekümmert. Im Gegensatz dazu wurde in QGIS 2.16 die entsprechende if-Anweisung entfernt (siehe Barrys Antwort oben), was zum Scheitern von führtrunalg
. Eine Lösung wäre, das Skript AlgorithmExecutor.py manuell zu bearbeiten, indem die fehlenden Zeilen erneut hinzugefügt werden. In diesem Fall müsste am Anfang des Skripts (from processing.core.SilentProgress import SilentProgress
) eine weitere Importzeile hinzugefügt werden .Ich werde auch das QGIS-Kernteam fragen, ob es einen besonderen Grund für die Entfernung dieser Leitungen gibt. Mit etwas Glück werden sie sie wieder hinzufügen ...
quelle
Das letzte Stück des ursprünglichen Fehlers:
sagt das
progress
istNone
, alsoprogress.error
schlägt der Anruf fehl. Dies löst dann den ersten Teil des angezeigten Fehlers aus, da der QGIS-Fehlerbehandler versucht, eine Nachricht in ein iface-Objekt zu schreiben, das ebenfalls nicht vorhanden ist.Das relevante Bit des Python-Codes von Processing, das den ursprünglichen Fehler generiert, ist:
Aus irgendeinem Grund hat der Algorithmus eine GeoAlgorithmExecutionException ausgelöst und
progress
ist None. Ich weiß nicht, woherprogress
es kommen soll - vielleicht sollte Ihr Python-Skript etwas erstellen, um es weiterzugeben. Ich weiß auch nicht, ob es den GeoAlg-Fehler auslöst oder welches der beiden Probleme das ist, das Sie wirklich beheben müssen ...quelle