Natknąłem się na dziwny problem podczas uruchamiania samodzielnych skryptów przetwarzających PyQGIS. Kolejność importu w skrypcie wpływa na jego normalne wykonanie.
Możesz odtworzyć problem, otwierając konsolę Python i wprowadzając następujący skrypt (używam GNU / Linux, QGIS 2.6.1, wtyczki przetwarzania v.2.2.0-2 i 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()
Powinieneś uzyskać:
ALGORITHM: Create grid
HSPACING <ParameterNumber>
VSPACING <ParameterNumber>
WIDTH <ParameterNumber>
HEIGHT <ParameterNumber>
CENTERX <ParameterNumber>
CENTERY <ParameterNumber>
GRIDTYPE <ParameterSelection>
CRS <ParameterCrs>
SAVENAME <OutputVector>
Z drugiej strony, jeśli zmienisz kolejność importu (linie 3 i 4), w ten sposób:
from PyQt4.QtGui import QApplication
from qgis.core import QgsApplication
skrypt powraca teraz ... None
, ponieważ algorytm nie został znaleziony.
Ten problem oznacza, że nie można uruchomić algorytmów przetwarzania poza QGIS, jeśli (przypadkowo) zapisujesz import w niewłaściwej kolejności.
Sprawdziłem w StackOverflow, ale zgodnie z tym, czy kolejność importowania w Pythonie ma znaczenie , kolejność nie powinna mieć znaczenia. Ponadto Przewodnik po stylu dla kodu Python mówi nam, aby najpierw zaimportować biblioteki standardowe (bardziej ogólne), następnie powiązane biblioteki stron trzecich, a na koniec zaimportować aplikacje lokalne. Myślę, że PyQt4 należy do drugiej kategorii importu, podczas gdy PyQGIS byłby specyficzny dla aplikacji lokalnych, więc import PyQt4 powinien być na pierwszym miejscu (choć nie jestem ekspertem w tej dziedzinie).
Czy masz pojęcie, dlaczego tak się stało? Czy kiedykolwiek doświadczyłeś czegoś podobnego?
EDYCJA 1: Zmieniono import niejawny ( from abc import *
) na jawny (np. from abc import xyz
), Jak sugeruje @ mike-t.