8 votos

QGIS 2.16: processing.runalg falla cuando se ejecuta fuera de QGIS en una aplicación personalizada

Estoy desarrollando el RQGIS paquete. Para ejecutar QGIS desde dentro de R, que yo llamo de QGIS a través de la línea de comandos. Esto funcionó a la perfección con QGIS 2.14. Se ejecuta el mismo código con QGIS 2.16, sin embargo, se produce un error. Aquí es lo que yo hago:

En primer lugar, he de poner todos los caminos necesarios en el símbolo del sistema:

@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, ejecutar el siguiente líneas en 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")

Esto funciona. Sin embargo, llamar de procesamiento.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,)

...produce este mensaje de error:

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'

5voto

UloPe Puntos 45

El error de procesamiento fue fijado recientemente, ver https://github.com/qgis/QGIS/commit/df2ca2e60798315d816966f25aa024b93835f776

5voto

Barry, gracias por tus consejos. Al parecer, el núcleo de QGIS equipo cambió el código. En QGIS 2.14 runalg se define de la siguiente manera:

def runalg(alg, progress=None):
  """Executes a given algorithm, showing its progress in the
  progress object passed along.

  Return true if everything went OK, false if the algorithm
  could not be completed.
  """

  if progress is None:
      progress = SilentProgress()
  try:
      alg.execute(progress)
      return True
  except GeoAlgorithmExecutionException as e:
      ProcessingLog.addToLog(sys.exc_info()[0], ProcessingLog.LOG_ERROR)
      progress.error(e.msg)
      return False

Así que si el progreso es igual a None (que es el caso de mi ejemplo de código), SilentProgress tuvo cuidado de él. Por el contrario, en QGIS 2.16 el correspondiente si-declaración fue eliminado (véase Barry respuesta anterior), lo que conduce a la insuficiencia de runalg. Una solución sería editar manualmente el AlgorithmExecutor.py secuencia de comandos mediante la adición de nuevo las líneas que faltan. En este caso, habría que agregar otra línea de importación para el comienzo de la secuencia de comandos (from processing.core.SilentProgress import SilentProgress).

Voy a pedir también el núcleo de QGIS equipo si hay una razón especial por la eliminación de estas líneas. Con un poco de suerte, van a añadir de nuevo...

4voto

Jay Bazuzi Puntos 194

Este último bit de la original de error:

  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'

es decir que progress es None, por lo que el progress.error llamada falla. Este, a continuación, activa la primera parte de la muestra error porque QGIS controlador de error intenta escribir un mensaje a un iface objeto que no existe.

Los correspondientes bits de Procesamiento del código de python que genera el error original es:

def runalg(alg, progress=None):
    """Executes a given algorithm, showing its progress in the
    progress object passed along.

    Return true if everything went OK, false if the algorithm
    could not be completed.
    """
    try:
        alg.execute(progress)
        return True
    except GeoAlgorithmExecutionException as e:
        ProcessingLog.addToLog(sys.exc_info()[0], ProcessingLog.LOG_ERROR)
        progress.error(e.msg)  ## this line ##
        return False

Así que por alguna razón el algoritmo ha planteado una GeoAlgorithmExecutionException y progress Ninguno. No sé de donde progress está destinado a venir de - tal vez su secuencia de comandos de python debería crear algo para pasar a ella. No conozco su recaudación de la GeoAlg error, o cual de los dos problemas es el que realmente necesita para arreglar...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X