Как запустить простой скрипт на Python для QGIS извне (например, Sublime Text)?

37

Я хотел бы запустить несколько небольших и простых сценариев Python для QGIS (Mac) "снаружи" QGIS. Под внешним я имею в виду в этом контексте либо обычную командную строку os (Terminal.app), либо, что еще лучше, непосредственно из Sublime Text (текстовый редактор), но определенно не через встроенную консоль Python QGIS.

Я прочитал различные учебные пособия, например, http://www.qgis.org/pyqgis-cookbook/intro.html#python-applications, и я могу получить ссылку на приложение QGIS, но, к сожалению, нет qgis.utils.ifaceили что-то еще более глубокое , Этот небольшой фрагмент кода должен, например, распечатать имя активного слоя ... вот что у меня есть:

    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()

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

Бенедикт Грос
источник

Ответы:

32

Вы не можете получить ссылку на ifaceобъект здесь, потому что он не существует в этом контексте. Объект iface( QgisInterface) является вспомогательным объектом для плагинов или сценариев, выполняющихся внутри QGIS, для доступа к основным объектам, например холсту карты, легенде, композитору и т. Д., И существует только во время работы основного приложения.

Когда вы создаете автономный скрипт Python с использованием API QGIS, ничего из этого не существует, потому что вы создаете свое собственное картографическое приложение.

Есть три разные ситуации:

  1. Плагин QGIS
  2. Скрипт, который запускается внутри QGIS (не плагин) для автоматизации
  3. Автономное приложение с использованием API QGIS

1.и 2.есть доступ iface, последний не имеет.

Для 3если вы хотите , чтобы создать сценарий , который открывает слой в карте холст вы могли бы сделать это после того,QgsApplication.initQgis()

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

Однако, если вы действительно ищете что-то вроде 2этого, вы можете просто написать это в своем редакторе сценариев

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

qgis.utils.iface.activeLayer()

но это должно быть запущено внутри QGIS для qgis.utilsработы. Это можно сделать, включив PATHи запустив скрипт import scriptnameв консоли Python или используя плагин ScriptRunner.

Обратите внимание, что следующее еще не QGIS

Есть число, 4которое еще не было добавлено, и, надеюсь, будет в будущем, и это опция для запуска QGIS с аргументом командной строки, чтобы сказать запустить этот код.

Например:

qgis --code=mycodefile.py

Регистрация плагинов (версия 1.8)

Вы можете использовать класс QgsMessageLog для регистрации информации в окне журнала QGIS. Желтый восклицательный знак в правом нижнем углу.

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

или без использования лямбды

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

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

Натан У
источник
Спасибо за разъяснения и быстрый ответ! тогда я отчаянно жду варианта 4. В то же время мне приходится мириться с этим 2, что является настоящей болью, за которой все время import scriptследуют reload(script)и, конечно же, переходят из моего редактора в QGIS. Я также проверил плагин scriptrunner, который является многообещающим, но затем я не смог получить print "debug value"его в консоли QGIS. Знаете ли вы, каким-либо образом, каким образом скрипт сценария запускает что-то для консоли QGIS? Большое спасибо! Будем ждать вашего ответа и затем закроем вопрос!
Бенедикт Грос
Консоль python на самом деле не предназначена для такого рода вывода, а больше только для ввода. Что вы можете сделать, это войти в окно журнала QGIS. Добавлю в ответ, чтобы объяснить это.
Натан W
Благодарность! это очень полезно. мой обходной путь - использовать всплывающее окно для получения результатов отладкиdef info(text): QMessageBox.information(None,"Debug Info", str(text))
Benedikt Groß
опечатка:QgsVector_y_Layer
Ник Волынкин
14

Я думаю, что ответ Натана У устарел. Я смог запустить скрипты Python QGIS (версия 2.6) из командной строки (вариант Натана 4), используя следующие команды.

man qgis
qgis -nologo --project /path/foo.qgs --code /path/foo.py
jsta
источник
Это работает, но только после того, как я закрою окно «подсказок» ... есть ли способ полностью отключить интерфейс и просто выполнить --codeскрипт python?
Энтони О.
5

Обновление для варианта 4 Натана: (Windows, QGIS 2.18 Лас-Пальмас)

Чтобы распечатать справочный документ QGIS,

qgis --help

Чтобы открыть QGIS, загрузите проект, затем запустите скрипт python.

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

Эти команды должны запускаться в OSGeo4W Shell без проблем.

swatchai
источник
1
Мой ответ все еще действителен для QGIS 3.8 (Занзибар).
Swatchai