Як запустити алгоритми 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.

Я відчуваю, що мені не вистачає ініціалізації. Але що?

Чи є кращий спосіб протестувати модель, крім введення тонни параметрів за допомогою GUI?

ОНОВЛЕННЯ 2.07.2012

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

ОНОВЛЕННЯ 27.07.2012

Альтернативою Script Runner є використання консолі IPython для налагодження сценаріїв. Окрім цього, схоже, не існує способу зробити просте тестування з секстантом без нічого іншого :(

ОНОВЛЕННЯ 30.07.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-користувача чи qgis-розробника замість SE.


Ви не можете отримати доступ ifaceдо окремого сценарію QGIS. ifaceвикористовується лише під час роботи в бічній QGIS.
Nathan W

Відповіді:


5

Ви можете створити свій сценарій для роботи з плагіном Gary Sherman Script Runner і запустити його з QGIS. Після повторного запуску скрипту після редагування слід запропонувати програмі Script Runner перезавантажити модуль і відобразити ваші зміни. Дивіться також: Список плагінів.qgis.org у списку Runner Script .

Основні принципи полягають у тому, щоб переконатися, що у вас функція run_script, яку викликає Script Runner (приклад зі свого блогу):

def run_script(iface):
    ldr = Loader(iface)
    ldr.load_shapefiles('/vmap0_shapefiles')

Хоча в теорії це справді має допомогти налагоджувати (хоча всередині QGIS), схоже, він зламаний у Windows. Він постійно говорить AttributeError: 'module' object has no attribute 'run_script'і продовжує наполягати на тому, що у мене немає жодної документації, яку я можу бачити в переглядачі джерела.
mlt

Ви додали def run_script(iface)функцію? Без цього ваш сценарій не запуститься у програмі Script Runner.
dakcarto

Мабуть, не слід називати сценарій тестом :-) mytest працює нормально досі. Було б добре, якби __import__сферу можна було обмежити, а не шукати всюди sys.path. Він показує docstring та список інших функцій.
mlt


4

Sextante має бути ініціалізований, тому він завантажує алгоритми і може згодом їх виконувати.

Зателефонуйте Sextante.initialize (), перш ніж робити що-небудь.


Привіт Вікторе, це все одно? Я борюся з тим, як викликати Sextante в автономному сценарії (за межами QGIS) і знаходжу всі приклади, з якими Google не працює. Це було розміщено рік тому, і мені цікаво, чи змінилася архітектура секстанта?
Багатий

3

Для нових користувачів, які читають цю публікацію, існує спосіб запуску алгоритмів обробки QGIS в автономних сценаріях PyQGIS. Перевірте відповіді на помилку імпорту на qgis.core під час запуску сценарію оболонки OSGeo4w і як я можу отримати доступ до `обробки 'за допомогою Python? , які надають вам перевірені приклади.


1
А причиною знищення є ...?
Germán Carrillo

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

Прошу вибачення, я мав би дати це зрозуміти. Це був лише приклад. Я не збираюся використовувати SAGA зокрема.
mlt

2

Згідно Як запустити простий скрипт python для QGIS ззовні (наприклад, піднесений текст)? тут ви не можете отримати посилання на ifaceоб'єкт, оскільки він не існує в цьому контексті, оскільки він працює за межами QGIS. Будь-який прогрес?


Так, будь ласка, перевірте мою відповідь.
Герман Каррілло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.