Як запустити простий скрипт python для QGIS ззовні (наприклад, піднесений текст)?


37

Я хотів би запустити кілька невеликих і простих скриптів python для QGIS (Mac) з "зовні" QGIS. Я маю на увазі в цьому контексті або звичайний командний рядок os (terminal.app), або навіть краще, безпосередньо з піднесеного тексту (текстовий редактор), але точно не через вбудовану консоль пітону 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. Чи знаєте ви, випадково, спосіб, як скрипт scriptrunner надрукувати щось на консолі QGIS? Велике дякую! Будемо чекати вашої відповіді, а потім закрийте питання!
Benedikt Groß

Консоль python насправді не призначений для такого виду, а просто для введення. Що ви можете зробити - це увійти до вікна журналу QGIS. Додамо до відповіді, щоб пояснити це.
Nathan 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

Це працює, але лише після того, як я закрию вікно "підказки" ... Чи існує спосіб повністю відключити інтерфейс і просто виконати --codeсценарій python?
Ентоні О.

5

Оновлення для параметра Натана 4: (Windows, QGIS 2.18 Las Palmas)

Щоб надрукувати довідковий документ QGIS,

qgis - допомогти

Щоб відкрити QGIS, завантажте проект, а потім запустіть скрипт python.

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

Ці команди повинні без проблем працювати в OSGeo4W Shell.


1
Моя відповідь досі справедлива для QGIS 3.8 (Занзібар).
swatchai
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.