W pewnym sensie utknąłem, próbując znaleźć sposób uruchomienia sextante z samodzielnego pytona z dystrybucji OSGeo4W. Powodem, dla którego chcę to zrobić, jest zmęczenie wprowadzaniem parametrów w oknie dialogowym za każdym razem, gdy chcę przetestować model z Model Builder.
Więc oto skrypt w języku Python nazwijmy go test.py
# as per http://qgis.org/pyqgis-cookbook/intro.html#using-pyqgis-in-custom-application
from qgis.core import *
# supply path to where is your qgis installed
QgsApplication.setPrefixPath("C:/OSGeo4W/apps/qgis", True)
# load providers
QgsApplication.initQgis()
from sextante.core.Sextante import Sextante
Sextante.alglist()
Sextante.alghelp("saga:slopeaspectcurvature")
Dzwonię z mojego pliku wsadowego
@echo off
set OSGEO4W_ROOT=C:\OSGeo4W
set PYTHONPATH=%OSGEO4W_ROOT%\apps\qgis\python;%OSGEO4W_ROOT%\apps\qgis\python\plugins;%HOME%/.qgis/python/plugins
set PATH=%OSGEO4W_ROOT%\bin;%OSGEO4W_ROOT%\apps\qgis\bin;%OSGEO4W_ROOT%\apps\qgis\plugins
python test.py
Problem polega na tym, że mówi, Algorithm not found
podczas gdy otrzymuję znaczące dane wyjściowe z konsoli python QGIS.
Czuję, że brakuje mi czegoś inicjującego. Ale co?
Czy jest lepszy sposób na przetestowanie modelu niż wprowadzenie ton parametrów za pomocą GUI?
AKTUALIZACJA 7/2/2012
Szukam ogólnego rozwiązania pythonowego do testowania przy użyciu algorytmów „moje”. Wspomniany algorytm jest tylko przykładem pokazującym, że coś prawdopodobnie nie zostało zainicjowane.
AKTUALIZACJA 7/27/2012
Alternatywą dla Script Runner jest użycie konsoli IPython do debugowania skryptów. Poza tym nie wydaje się, aby można było przeprowadzać proste testy jednostkowe przy użyciu sextante bez niczego innego :(
AKTUALIZACJA 7/30/2012
Jak sugeruje Victor Olaya, staram się zainicjować Sextante jak w poniższym kodzie.
#!/usr/bin/env python
import sys
from PyQt4.QtGui import QApplication
from sextante.core.Sextante import Sextante
def main():
""" main function or something """
# as per http://qgis.org/pyqgis-cookbook/intro.html#using-pyqgis-in-custom-application
from qgis.core import *
import qgis.utils
app = QApplication(sys.argv)
# supply path to where is your qgis installed
QgsApplication.setPrefixPath("C:/OSGeo4W/apps/qgis", True)
# load providers
QgsApplication.initQgis()
# how???
# qgis.utils.iface = QgisInterface.instance()
Sextante.initialize()
run_script(qgis.utils.iface)
def run_script(iface):
""" this shall be called from Script Runner"""
Sextante.alglist()
Sextante.alghelp("saga:slopeaspectcurvature")
if __name__=="__main__":
main()
Jednak dostaję coś takiego
Traceback (most recent call last):
File "test.py", line 29, in
main()
File "test.py", line 20, in main
Sextante.initialize()
File "C:\Documents and Settings\user\.qgis\python\plugins\sextante\core\Sextante.py", line 94, in initialize
Sextante.addProvider(GrassAlgorithmProvider())
File "C:\Documents and Settings\user\.qgis\python\plugins\sextante\grass\GrassAlgorithmProvider.py", lin
e 17, in __init__
self.actions.append(DefineGrassRegionAction())
File "C:\Documents and Settings\user\.qgis\python\plugins\sextante\grass\DefineGrassRegionAction.py", li
ne 16, in __init__
canvas = QGisLayers.iface.mapCanvas()
AttributeError: 'NoneType' object has no attribute 'mapCanvas'
Cóż ... to wszystko staje się dyskusją na liście mailowej. Być może warto przejść do qgis-user lub qgis-developer zamiast SE.
iface
w samodzielnym skrypcie QGIS.iface
jest użyteczny tylko podczas pracy w bocznym QGIS.Odpowiedzi:
Możesz stworzyć swój skrypt do pracy z wtyczką Gary'ego Shermana Script Runner i uruchomić go z poziomu QGIS. Ponowne uruchomienie skryptu, po edycji, powinno zachęcić Script Runnera do ponownego załadowania modułu i odzwierciedlenia twoich zmian. Zobacz także: wpis plugins.qgis.org w skrypcie Runnera .
Konieczne jest upewnienie się, że masz funkcję run_script, która jest wywoływana przez Script Runner (przykład z jego bloga):
źródło
AttributeError: 'module' object has no attribute 'run_script'
i upiera się, że nie mam żadnych dokumentów, które widzę w przeglądarce źródła.def run_script(iface)
funkcję? Bez tego skrypt nie będzie działał w Script Runner.__import__
zasięg można było ograniczyć, zamiast rozglądać się dookołasys.path
. Pokazuje dokumentację i listę innych funkcji.Sextante musi zostać zainicjowany, aby załadował algorytmy i mógł je później wykonać.
Wywołaj Sextante.initialize () przed zrobieniem czegokolwiek.
źródło
Dla nowych użytkowników czytających ten post istnieje sposób uruchamiania algorytmów przetwarzania QGIS w samodzielnych skryptach PyQGIS. Sprawdź odpowiedzi na Błąd importu qgis.core podczas uruchamiania skryptu powłoki OSGeo4w i Jak uzyskać dostęp do `przetwarzania` za pomocą Pythona? , które zapewniają przetestowane przykłady.
źródło
Ponieważ algorytm, którego chcesz użyć, jest częścią sagi, możesz użyć sagi bezpośrednio.
np. z pliku wsadowego:
źródło
Według Jak uruchomić prosty skrypt Pythona dla QGIS z zewnątrz (np. Sublime Text)? nie można tutaj uzyskać odniesienia do
iface
obiektu, ponieważ nie istnieje on w tym kontekście, ponieważ jest on uruchamiany poza QGIS. Jakiś postęp?źródło