Estou desenvolvendo o pacote RQGIS. Para executar o QGIS a partir do R, chamo o QGIS através da linha de comando. Isso funcionou perfeitamente com o QGIS 2.14. A execução do mesmo código com o QGIS 2.16, no entanto, produz um erro. Aqui está o que eu faço:
Primeiro, defino todos os caminhos necessários no prompt de comando:
@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
Posteriormente, eu executo as seguintes linhas no Python:
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")
Isso funciona. No entanto, chamando processing.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,)
... produz esta mensagem de erro:
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
fonte
fonte
alg.execute(progress)
poralg.execute(progress or SilentProgress())
AlgorithmExecutor.py para usar o QGIS em um aplicativo personalizado. O problema ficou ainda pior, pois agora não há nenhuma mensagem de erro. Em vez disso, existem até mensagens de sucesso (por exemplo, durante a execuçãosaga:catchmentarearecursive
), apenas as pastas de saída especificadas permanecem vazias. Eu apreciaria muito se você pudesse resolver esse problema. Ou eu estou esquecendo de alguma coisa?Barry, obrigado pelo seu conselho. Aparentemente, a equipe principal do QGIS mudou o código. No QGIS 2.14
runalg
foi definido da seguinte forma:Portanto, se o progresso for igual a
None
(que é o caso no meu código de exemplo),SilentProgress
cuidei dele. Por outro lado, no QGIS 2.16, a declaração if correspondente foi removida (consulte a resposta de Barry acima), o que leva à falha derunalg
. Uma solução seria editar manualmente o script AlgorithmExecutor.py adicionando novamente as linhas ausentes. Nesse caso, seria necessário adicionar outra linha de importação ao início do script (from processing.core.SilentProgress import SilentProgress
).Também perguntarei à equipe principal do QGIS se existe um motivo especial para a remoção dessas linhas. Com um pouco de sorte, eles os adicionarão novamente ...
fonte
Este último bit do erro original:
está dizendo que
progress
éNone
, por isso aprogress.error
chamada falha. Isso aciona a primeira parte do erro exibido porque o manipulador de erros QGIS tenta gravar uma mensagem em um objeto iface que também não existe.O bit relevante do código python do Processing que gera o erro original é:
Portanto, por algum motivo, o algoritmo gerou uma GeoAlgorithmExecutionException e
progress
é None. Eu não sei de onde eleprogress
deve vir - talvez o seu script python deva criar algo para passar para ele. Também não sei o que está causando o erro GeoAlg, ou qual dos dois problemas é o que você realmente precisa corrigir ...fonte