Estou meio que tentando descobrir o caminho para executar sextante a partir de um python independente da distribuição OSGeo4W. O motivo pelo qual desejo fazer isso é que me cansei de inserir parâmetros na caixa de diálogo toda vez que desejo testar um modelo no Model Builder.
Então aqui está o script python, vamos chamá-lo 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")
Que estou ligando do meu arquivo em lotes
@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
O problema é que ele diz Algorithm not found
que eu recebo uma saída significativa do console python do QGIS.
Sinto que estou faltando para inicializar alguma coisa. Mas o que?
Existe uma maneira melhor de testar um modelo que não seja através da inserção de toneladas de parâmetros usando a GUI?
ATUALIZAÇÃO 7/2/2012
Estou procurando uma solução python genérica para testar com algoritmos "mine". O algoritmo mencionado acima é apenas um exemplo que mostra que algo provavelmente não foi inicializado.
ATUALIZAÇÃO 7/27/2012
Uma alternativa ao Script Runner é usar o console IPython para depurar scripts. Fora isso, não parece haver uma maneira de fazer testes simples de unidade com sextante sem mais nada em execução :(
ATUALIZAÇÃO 30/07/2012
Como Victor Olaya sugere, tento inicializar o Sextante como no código abaixo.
#!/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()
No entanto, eu recebo algo como
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'
Bem ... tudo se torna uma discussão na lista de discussão. Talvez valha a pena mudar para qgis-user ou qgis-developer em vez de SE.
iface
em um script QGIS independente.iface
é útil apenas quando executado no lado QGIS.Respostas:
Você pode criar seu script para trabalhar com o plug - in Script Runner de Gary Sherman e executá-lo no QGIS. A nova execução do script, após a edição, deve solicitar ao Script Runner que recarregue o módulo e reflita suas alterações. Veja também: Listagem de plugins.qgis.org do Script Runner .
O essencial é garantir que você tenha uma função run_script, que é chamada pelo Script Runner (exemplo de seu blog):
fonte
AttributeError: 'module' object has no attribute 'run_script'
e continua insistindo que não tenho documentos que eu possa ver no visualizador de código-fonte.def run_script(iface)
função? Seu script não será executado no Script Runner sem isso.__import__
escopo pudesse ser restringido em vez de parecer todosys.path
. Ele mostra a documentação e a lista de outras funções.O Sextante precisa ser inicializado, para carregar os algoritmos e depois executá-los.
Chame Sextante.initialize () antes de fazer qualquer coisa.
fonte
Para novos usuários que estão lendo este post, existe uma maneira de executar algoritmos de processamento QGIS em scripts PyQGIS independentes. Verifique as respostas do erro de importação do qgis.core ao executar o script de shell do OSGeo4w e como posso acessar o `processing` com o Python? , que fornecem exemplos testados.
fonte
Como o algoritmo que você deseja usar faz parte da saga, você pode usá-la diretamente.
por exemplo, de um arquivo em lote:
fonte
De acordo com Como executar um script python simples para QGIS de fora (por exemplo, Sublime Text)? você não pode obter uma referência ao
iface
objeto aqui porque ele não existe neste contexto, pois está sendo executado fora do QGIS. Algum progresso?fonte