Como executar um script python simples para QGIS de fora (por exemplo, texto sublime)?

37

Eu gostaria de executar alguns scripts python pequenos e simples para QGIS (Mac) de "fora" do QGIS. Com fora, quero dizer, nesse contexto, a linha de comando normal do sistema operacional (terminal.app) ou, melhor ainda, diretamente do Sublime Text (editor de texto), mas definitivamente não através do console python embutido do QGIS.

Eu li vários tutoriais, por exemplo, http://www.qgis.org/pyqgis-cookbook/intro.html#python-applications e sou capaz de obter uma referência ao aplicativo QGIS, mas infelizmente não é qgis.utils.ifaceou algo mais profundo . Este pequeno trecho de código deve, por exemplo, imprimir o nome da camada ativa ... aqui está o que eu tenho:

    import sys
    sys.path.append("/Applications/QGIS.app/Contents/Resources/python")

    from qgis.core import *
    import qgis.utils

    print "helo" # console output: helo

    QgsApplication.setPrefixPath("/Applications/QGIS.app/", True)
    QgsApplication.initQgis()

    print QgsApplication # console output: <class 'qgis.core.QgsApplication'>

    print qgis.utils.iface # = console output: none

    aLayer = qgis.utils.iface.activeLayer()
    print aLayer.name()

    QgsApplication.exitQgis()

Por favor, não me responda agora como criar um plugin ou algo mais "pesado". Estou apenas procurando uma maneira rápida e fácil de gravar scripts de um confortável editor de texto para o QGIS.

Benedikt Groß
fonte

Respostas:

32

Você não pode obter uma referência ao ifaceobjeto aqui porque ele não existe neste contexto. O objeto iface( QgisInterface) é um objeto de conveniência para plugins ou scripts executados dentro do QGIS, para acessar os objetos principais, como a tela do mapa, legenda, compositor, etc., e só existe quando o aplicativo principal está sendo executado.

Quando você cria um script Python independente usando as APIs do QGIS, nada disso existe porque você está criando seu próprio aplicativo de mapeamento.

Existem três situações diferentes:

  1. Um plug-in QGIS
  2. Um script que é executado dentro do QGIS (não um plugin) para automação
  3. Aplicativo autônomo usando APIs QGIS

1.e 2.ter acesso iface, o último não.

Pois, 3se você deseja criar um script que abra uma camada em uma tela de mapa, faça isso depoisQgsApplication.initQgis()

map = QgsMapCanavs()
layer = QgsVectoryLayer('path.shp','myshapefile','ogr')
map.setLayerSet([layer])

No entanto, se você estiver realmente procurando por algo assim 2, basta escrever isso no seu editor de scripts

from qgis.core import *
from qgis.gui import *
import qgis.utils

qgis.utils.iface.activeLayer()

mas isso deve ser executado dentro do QGIS para qgis.utilsfuncionar. Isso pode ser feito colocando o script em PATHexecução import scriptnameno console Python ou usando o plug-in ScriptRunner.

Observe que o seguinte ainda não é o QGIS

Há um número 4que ainda não foi adicionado e, esperamos, será no futuro, e essa é a opção de executar o QGIS com uma linha de comando arg para dizer executar este código.

Por exemplo:

qgis --code=mycodefile.py

Log de plug-in (versão 1.8)

Você pode usar a classe QgsMessageLog para registrar informações na janela de log do QGIS. O ponto de exclamação amarelo no canto inferior direito.

from qgis.core import *
log = lambda m: QgsMessageLog.logMessage(m,'My Plugin') 
log('My message')

ou sem usar lambda

QgsMessageLog.logMessage('My message', 'My Plugin')

Eu prefiro o baseado em lambda, pois ele é mais curto e menos digitado a qualquer momento que você deseja registrar algo.

Nathan W
fonte
Obrigado pelo esclarecimento e pela resposta rápida! então estou esperando desesperadamente pela opção 4. Enquanto isso, tenho que conviver 2, o que é realmente doloroso o tempo todo import scriptseguido por reload(script)e, claro, mudar do meu editor para o QGIS. Também verifiquei o plug-in scriptrunner, o que é promissor, mas não consegui print "debug value"acessar o console do QGIS. Você sabe, por acaso, uma maneira de fazer com que um script scriptrunner imprima algo no console do QGIS? Muito Obrigado! Aguardarei sua resposta e feche a pergunta!
Benedikt Groß
O console python não é realmente destinado a esse tipo de saída, mas apenas para entrada. O que você pode fazer é fazer logon na janela de log do QGIS. Irá adicionar à resposta para explicar isso.
19712 Nathan W
obrigado! isso é extremamente útil. Minha solução foi a abusar de um pop-up para ter uma saída de depuraçãodef info(text): QMessageBox.information(None,"Debug Info", str(text))
Benedikt Groß
Erro de digitação:QgsVector_y_Layer
Nick Volynkin
14

Acho que a resposta de Nathan W está desatualizada. Consegui executar scripts python QGIS (versão 2.6) a partir da linha de comando (opção 4 de Nathan) usando os seguintes comandos.

man qgis
qgis -nologo --project /path/foo.qgs --code /path/foo.py
jsta
fonte
Isso funciona, mas somente depois que eu fecho a janela "dicas" ... existe uma maneira de desativar totalmente a interface e apenas executar o --codescript python?
Anthony O.
5

Atualização para a opção 4 de Nathan: (Windows, QGIS 2.18 Las Palmas)

Para imprimir o documento de ajuda do QGIS,

qgis --help

Para abrir o QGIS, carregue um projeto e execute um script python.

qgis --nologo --projeto c: /path/to/projfile.qgs --code c: /path/to/code.py

Esses comandos devem ser executados no OSGeo4W Shell sem problemas.

swatchai
fonte
1
Minha resposta ainda é válida para o QGIS 3.8 (Zanzibar).
swatchai