Me encontré con un problema extraño al ejecutar scripts de procesamiento PyQGIS independientes. El orden de las importaciones en el script afecta su ejecución normal.
Puede reproducir el problema abriendo una consola de Python e ingresando el siguiente script (uso GNU / Linux, QGIS 2.6.1, plugin de procesamiento v.2.2.0-2 y Python 2.7.3):
# Prepare the environment
import sys
from qgis.core import QgsApplication
from PyQt4.QtGui import QApplication
app = QApplication([])
QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()
# Prepare processing framework
sys.path.append('/home/YOUR_USER/.qgis2/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()
print Processing.getAlgorithm("qgis:creategrid")
# Exit applications
QgsApplication.exitQgis()
QApplication.exit()
Debes obtener:
ALGORITHM: Create grid
HSPACING <ParameterNumber>
VSPACING <ParameterNumber>
WIDTH <ParameterNumber>
HEIGHT <ParameterNumber>
CENTERX <ParameterNumber>
CENTERY <ParameterNumber>
GRIDTYPE <ParameterSelection>
CRS <ParameterCrs>
SAVENAME <OutputVector>
Por otro lado, si cambia el orden de las importaciones (líneas 3 y 4), de esta manera:
from PyQt4.QtGui import QApplication
from qgis.core import QgsApplication
el script ahora regresa ... None
, porque no se encontró el algoritmo.
Este problema implica que no puede ejecutar algoritmos de procesamiento fuera de QGIS si (por casualidad) escribe importaciones en el orden incorrecto.
He comprobado en StackOverflow, pero según importa el orden de importación de Python , el orden realmente no debería importar. Además, la Guía de estilo para Python Code nos dice que primero importemos bibliotecas estándar (más genéricas), luego bibliotecas de terceros relacionadas y, finalmente, importaciones específicas de aplicaciones locales. Creo que PyQt4 se encuentra en la segunda categoría de importaciones, mientras que PyQGIS sería una aplicación local específica, por lo que las importaciones de PyQt4 deberían ser lo primero (aunque no soy un experto en esto).
¿Tienes una idea de por qué esto podría suceder? ¿Alguna vez has experimentado algo similar?
EDITAR 1: Cambió las importaciones implícitas ( from abc import *
) por las explícitas (por ejemplo, from abc import xyz
) como lo sugiere @ mike-t.