Ho riscontrato un problema strano durante l'esecuzione di script di elaborazione PyQGIS autonomi. L'ordine delle importazioni nello script influisce sulla sua normale esecuzione.
Puoi riprodurre il problema aprendo una console Python e inserendo il seguente script (utilizzo GNU / Linux, QGIS 2.6.1, plug-in di elaborazione v.2.2.0-2 e 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()
Dovresti ottenere:
ALGORITHM: Create grid
HSPACING <ParameterNumber>
VSPACING <ParameterNumber>
WIDTH <ParameterNumber>
HEIGHT <ParameterNumber>
CENTERX <ParameterNumber>
CENTERY <ParameterNumber>
GRIDTYPE <ParameterSelection>
CRS <ParameterCrs>
SAVENAME <OutputVector>
D'altra parte, se si cambia l'ordine delle importazioni (righe 3 e 4), in questo modo:
from PyQt4.QtGui import QApplication
from qgis.core import QgsApplication
lo script ora ritorna ... None
, perché l'algoritmo non è stato trovato.
Questo problema implica che non è possibile eseguire algoritmi di elaborazione su QGIS se (per caso) si scrivono importazioni nell'ordine sbagliato.
Ho controllato StackOverflow ma secondo Import importa l'ordine di Python , l'ordine non dovrebbe davvero importare. Inoltre, la Guida di stile per Python Code ci dice di importare prima le librerie standard (più generiche), quindi le librerie di terze parti correlate e, infine, le importazioni specifiche delle applicazioni locali. Penso che PyQt4 rientri nella seconda categoria di importazioni, mentre PyQGIS sarebbe specifico per l'applicazione locale, quindi le importazioni di PyQt4 dovrebbero venire prima (non sono un esperto in questo, però).
Hai un'idea del perché ciò possa accadere? Hai mai provato qualcosa di simile?
EDIT 1: Importazioni implicite modificate ( from abc import *
) da esplicite (ad es. from abc import xyz
) Come suggerito da @ mike-t.