Как запустить алгоритмы sextante за пределами консоли Python QGIS?

10

Я немного застрял, пытаясь выяснить способ запуска sextante из автономного питона из дистрибутива OSGeo4W. Причина, по которой я хочу это сделать, заключается в том, что я устал вводить параметры в диалоговом окне каждый раз, когда хочу протестировать модель из Model Builder.

Итак, вот скрипт Python давайте назовем его 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")

Что я звоню из моего пакетного файла

@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

Проблема в том, что он говорит, Algorithm not foundтогда как я получаю значимый вывод из консоли Python QGIS.

Я чувствую, что мне не хватает чего-то инициализировать. Но что?

Есть ли лучший способ проверить модель, кроме как путем ввода тонны параметров с помощью графического интерфейса?

ОБНОВЛЕНИЕ 2/2/2012

Я ищу общее питоническое решение для тестирования с "моими" алгоритмами. Вышеупомянутый алгоритм - просто пример, показывающий, что что-то, вероятно, не было инициализировано.

ОБНОВЛЕНИЕ 27/27/2012

Альтернативой Script Runner является использование консоли IPython для отладки сценариев. Кроме этого, похоже, нет способа выполнить простое модульное тестирование с секстанте, когда больше ничего не работает :(

ОБНОВЛЕНИЕ 30/30/2012

Как предполагает Виктор Олайя, я пытаюсь инициализировать Sextante, как показано в коде ниже.

#!/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()

Однако я получаю что-то вроде

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'

Ну ... все это становится обсуждением списка рассылки. Возможно, стоит перейти к qgis-user или qgis-developer вместо SE.

MLT
источник
Вы не можете получить доступ ifaceв автономном скрипте QGIS. ifaceиспользуется только при работе в боковой QGIS.
Натан Ш

Ответы:

5

Вы можете создать свой сценарий для работы с плагином Script Runner Гэри Шермана и запустить его из QGIS. Повторный запуск скрипта после редактирования должен побудить Script Runner перезагрузить модуль и отразить ваши изменения. Смотрите также: список plugins.qgis.org для скриптов- бегунов .

Главное, чтобы у вас была функция run_script, которая вызывается Script Runner (пример из его блога):

def run_script(iface):
    ldr = Loader(iface)
    ldr.load_shapefiles('/vmap0_shapefiles')
dakcarto
источник
Хотя в теории это действительно должно помочь в отладке (хотя внутри QGIS), похоже, что оно не работает в Windows. Он продолжает говорить AttributeError: 'module' object has no attribute 'run_script'и настаивает на том, что у меня нет строк документации, которые я могу видеть в просмотрщике исходного кода.
млт
Вы добавили def run_script(iface)функцию? Ваш скрипт не будет работать в Script Runner без этого.
Даккарто
Видимо, не стоит называть скрипт тестом :-) mytest пока работает нормально. Было бы неплохо, если бы __import__область видимости могла быть ограничена, вместо того, чтобы смотреть по сторонам sys.path. Показывает строку документации и список других функций.
млт
Сценарий Runner обновляется здесь
Дэйв Икс
4

Sextante должен быть инициализирован, поэтому он загружает алгоритмы и может позже выполнить их.

Вызовите Sextante.initialize (), прежде чем делать что-либо.

Виктор Олайя
источник
Привет Виктор, это все еще так? Я борюсь с тем, как вызвать Sextante в автономном скрипте (за пределами QGIS), и нахожу все примеры, которые я гуглюл, не работает. Это было опубликовано год назад, так что мне интересно, изменилась ли архитектура sextante?
Богатый
3

Для новых пользователей, читающих этот пост, есть способ запуска алгоритмов обработки QGIS в автономных скриптах PyQGIS. Проверьте ответы на Ошибка импорта для qgis.core при запуске сценария оболочки OSGeo4w и Как я могу получить доступ к `обработке` с помощью Python? , которые предоставляют вам проверенные примеры.

Герман Каррильо
источник
1
И причина понижения голоса ...?
Герман Каррильо
2

Поскольку алгоритм, который вы хотите использовать, является частью саги, вы можете использовать сагу напрямую.

например, из пакетного файла:

@ECHO OFF

REM SET SAGA_MLB = C:\SAGA\Modules
REM SET PATH = %PATH%;C:\SAGA

saga_cmd ta_morphometry "Slope, Aspect, Curvature" -ELEVATION=elevation.sgrd -SLOPE=slope.sgrd -ASPECT=aspect.sgrd -CURV=NULL -HCURV=NULL -VCURV=NULL -METHOD=5

PAUSE
johanvdw
источник
Я прошу прощения, я должен был дать понять. Это был просто пример. Я не собираюсь использовать SAGA в частности.
млт
2

Согласно Как запустить простой питон скрипт для QGIS из вне (например Sublime Text)? Вы не можете получить ссылку на ifaceобъект здесь, потому что он не существует в этом контексте, так как он запускается вне QGIS. Какой-либо прогресс?

Мартин
источник
Да, пожалуйста, проверьте мой ответ.
Герман Каррильо