J'ai rencontré un problème étrange lors de l'exécution de scripts de traitement PyQGIS autonomes. L'ordre des importations dans le script affecte son exécution normale.
Vous pouvez reproduire le problème en ouvrant une console Python et en entrant le script suivant (j'utilise GNU / Linux, QGIS 2.6.1, le plugin de traitement v.2.2.0-2 et 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()
Vous devez obtenir:
ALGORITHM: Create grid
HSPACING <ParameterNumber>
VSPACING <ParameterNumber>
WIDTH <ParameterNumber>
HEIGHT <ParameterNumber>
CENTERX <ParameterNumber>
CENTERY <ParameterNumber>
GRIDTYPE <ParameterSelection>
CRS <ParameterCrs>
SAVENAME <OutputVector>
En revanche, si vous changez l'ordre des importations (lignes 3 et 4), de cette façon:
from PyQt4.QtGui import QApplication
from qgis.core import QgsApplication
le script retourne maintenant ... None
, car l'algorithme est introuvable.
Ce problème implique que vous ne pouvez pas exécuter des algorithmes de traitement à partir de QGIS si vous (par hasard) écrivez les importations dans le mauvais ordre.
J'ai vérifié dans StackOverflow mais selon l' ordre d'importation de Python , l'ordre ne devrait pas vraiment avoir d'importance. De plus, le Guide de style pour le code Python nous dit d'importer d'abord les bibliothèques standard (plus génériques), puis les bibliothèques tierces associées, et enfin les importations spécifiques aux applications locales. Je pense que PyQt4 se situe dans la deuxième catégorie d'importations, alors que PyQGIS serait spécifique à l'application locale, donc les importations PyQt4 devraient venir en premier (je ne suis pas un expert en la matière, cependant).
Avez-vous une idée de pourquoi cela pourrait arriver? Avez-vous déjà vécu quelque chose de similaire?
EDIT 1: Modification des importations implicites ( from abc import *
) par des importations explicites (par exemple, from abc import xyz
) comme suggéré par @ mike-t.