Eu me deparei com um problema estranho ao executar scripts de processamento PyQGIS independentes. A ordem das importações no script afeta sua execução normal.
Você pode reproduzir o problema abrindo um console Python e inserindo o seguinte script (eu uso o GNU / Linux, QGIS 2.6.1, plugin de processamento 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()
Você deve obter:
ALGORITHM: Create grid
HSPACING <ParameterNumber>
VSPACING <ParameterNumber>
WIDTH <ParameterNumber>
HEIGHT <ParameterNumber>
CENTERX <ParameterNumber>
CENTERY <ParameterNumber>
GRIDTYPE <ParameterSelection>
CRS <ParameterCrs>
SAVENAME <OutputVector>
Por outro lado, se você alternar a ordem das importações (linhas 3 e 4), desta maneira:
from PyQt4.QtGui import QApplication
from qgis.core import QgsApplication
o script agora retorna ... None
, porque o algoritmo não foi encontrado.
Esse problema implica que você não pode executar algoritmos de processamento fora do QGIS se (por acaso) gravar importações na ordem errada.
Eu verifiquei no StackOverflow, mas de acordo com o pedido de importação do Python importa , o pedido não deve realmente importar. Além disso, o Guia de Estilo para Código Python nos diz para importar bibliotecas padrão (mais genéricas) primeiro, depois bibliotecas de terceiros relacionadas e, finalmente, importações específicas de aplicativos locais. Eu acho que o PyQt4 está na 2ª categoria de importações, enquanto o PyQGIS seria específico do aplicativo local, portanto as importações do PyQt4 devem vir primeiro (embora não seja especialista nisso).
Você tem uma idéia de por que isso poderia acontecer? Você já experimentou algo semelhante?
EDIT 1: Alteradas importações implícitas ( from abc import *
) por explícitas (por exemplo, from abc import xyz
) como sugerido por @ mike-t.