Me he encontrado con un problema extraño al ejecutar scripts de procesamiento independientes de PyQGIS. El orden de las importaciones en el script afecta a su ejecución normal.
Puedes reproducir el problema abriendo una consola de Python e introduciendo lo siguiente script (utilizo GNU/Linux, QGIS 2.6.1, processing plugin 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()
Deberías 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 se cambia el orden de las importaciones (líneas 3 y 4), así
from PyQt4.QtGui import QApplication
from qgis.core import QgsApplication
el script vuelve ahora... None
porque no se ha encontrado el algoritmo.
Este problema implica que no se pueden ejecutar algoritmos de procesamiento fuera de QGIS si (por casualidad) se escriben las importaciones en el orden equivocado.
He comprobado en StackOverflow pero según ¿Importa el orden de importación de Python? El orden no debería importar. Además, el Guía de estilo para el código Python nos indica que debemos importar primero las bibliotecas estándar (más genéricas), luego las bibliotecas de terceros relacionadas y, por último, las importaciones específicas de la aplicación local. Creo que PyQt4 se encuentra en la segunda categoría de importaciones, mientras que PyQGIS sería específico de la aplicación local, por lo que las importaciones de PyQt4 deberían ir primero (aunque no soy un experto en esto).
¿Tiene una idea de por qué puede ocurrir esto? ¿Ha experimentado alguna vez algo similar?
EDIT 1: Se han cambiado las importaciones implícitas ( from abc import *
) por otras explícitas (por ejemplo from abc import xyz
) como sugiere @mike-t.
2 votos
Sólo quería decir, excelente pregunta con un breve ejemplo reproducible y pruebas de investigación y análisis de esa investigación.