Jak uruchomić prosty skrypt Pythona dla QGIS z zewnątrz (np. Sublime Text)?

37

Chciałbym uruchomić kilka małych i prostych skryptów Pythona dla QGIS (Mac) z „poza” QGIS. Z zewnątrz mam na myśli w tym kontekście albo normalną linię poleceń os (terminal.app), albo nawet lepiej, bezpośrednio z Sublime Text (edytor tekstu), ale zdecydowanie nie za pośrednictwem wbudowanej konsoli python QGIS.

Przeczytałem różne samouczki, np. Http://www.qgis.org/pyqgis-cookbook/intro.html#python-applications i jestem w stanie uzyskać odniesienie do aplikacji QGIS, ale niestety nie do qgis.utils.ifaceczegoś głębszego . Ten mały fragment kodu powinien na przykład wypisać nazwę aktywnej warstwy ... oto co mam:

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

Nie odpowiadaj mi teraz, jak utworzyć wtyczkę lub coś „ciężkiego”. Po prostu szukam szybkiego i łatwego sposobu na strzelanie skryptami z wygodnego edytora tekstów do QGIS.

Benedikt Groß
źródło

Odpowiedzi:

32

Nie można tutaj uzyskać odniesienia do ifaceobiektu, ponieważ nie istnieje on w tym kontekście. Obiekt iface( QgisInterface) jest obiektem wygodnym dla wtyczek lub skryptów działających w QGIS, aby uzyskać dostęp do głównych obiektów, np. Kanwy mapy, legendy, kompozytora itp. I istnieje tylko wtedy, gdy główna aplikacja jest uruchomiona.

Podczas tworzenia samodzielnego skryptu Python za pomocą interfejsów API QGIS nic z tych rzeczy nie istnieje, ponieważ tworzysz własną aplikację do mapowania.

Istnieją trzy różne sytuacje:

  1. Wtyczka QGIS
  2. Skrypt działający w QGIS (nie jest wtyczką) do automatyzacji
  3. Autonomiczna aplikacja korzystająca z interfejsów API QGIS

1.i 2.mieć dostęp iface, ostatni nie.

Bo 3jeśli chcesz stworzyć skrypt otwierający warstwę w kanwie mapy, zrobiłbyś to późniejQgsApplication.initQgis()

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

Jeśli jednak naprawdę szukasz czegoś takiego 2, możesz po prostu napisać to w edytorze skryptów

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

qgis.utils.iface.activeLayer()

ale musi działać w QGIS qgis.utils. Można to zrobić, PATHuruchamiając skrypt i uruchamiając go import scriptnamew konsoli Python lub używając wtyczki ScriptRunner.

Pamiętaj, że poniższe informacje nie są jeszcze QGIS

Jest jeszcze liczba 4, która nie została jeszcze dodana, i mam nadzieję, że będzie w przyszłości, i jest to opcja, aby uruchomić QGIS z argumentem linii poleceń, aby powiedzieć uruchomić ten kod.

Na przykład:

qgis --code=mycodefile.py

Logowanie wtyczek (wersja 1.8)

Za pomocą klasy QgsMessageLog można rejestrować informacje w oknie dziennika QGIS. Żółty wykrzyknik w prawym dolnym rogu.

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

lub bez użycia lambda

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

Wolę ten oparty na lambda, ponieważ jest krótszy i mniej pisze się za każdym razem, gdy chcesz coś zalogować.

Nathan W.
źródło
Dziękuję za wyjaśnienia i szybką odpowiedź! potem desperacko czekam na opcję 4. W międzyczasie muszę żyć 2, co jest naprawdę ból robi cały czas import scriptnastępnie reload(script)i zmiany kursu z moim edytorze do QGIS. Sprawdziłem również wtyczkę scriptrunner, która jest obiecująca, ale potem nie byłem w stanie dostać się print "debug value"do konsoli QGIS. Czy znasz przypadkiem sposób, w jaki skrypt scriptrunner drukuje coś na konsoli QGIS? Wielkie dzięki! Poczekam na twoją odpowiedź, a następnie zamkniesz pytanie!
Benedikt Groß
Konsola python nie jest tak naprawdę przeznaczona do tego rodzaju danych wyjściowych, a bardziej do wprowadzania danych. Co możesz zrobić, to zalogować się do okna dziennika QGIS. Dodaję do odpowiedzi, aby to wyjaśnić.
Nathan W
dzięki! to jest bardzo pomocne. moim obejściem było nadużywanie wyskakującego okienka w celu uzyskania wyniku debugowaniadef info(text): QMessageBox.information(None,"Debug Info", str(text))
Benedikt Groß
literówka:QgsVector_y_Layer
Nick Volynkin,
14

Myślę, że odpowiedź Nathana W. jest nieaktualna. Udało mi się uruchomić skrypty python QGIS (wersja 2.6) z wiersza poleceń (opcja Nathana 4) przy użyciu następujących poleceń.

man qgis
qgis -nologo --project /path/foo.qgs --code /path/foo.py
jsta
źródło
Działa to, ale dopiero po zamknięciu okna „wskazówek” ... czy istnieje sposób całkowitego wyłączenia interfejsu i wykonania --codeskryptu python?
Anthony O.
5

Aktualizacja dla opcji Nathana 4: (Windows, QGIS 2.18 Las Palmas)

Aby wydrukować dokument pomocy QGIS,

qgis --help

Aby otworzyć QGIS, załaduj projekt, a następnie uruchom skrypt w języku Python.

qgis - technologo --projekt c: /path/to/projfile.qgs --code c: /path/to/code.py

Te polecenia powinny działać bez problemu na powłoce OSGeo4W.

swatchai
źródło
1
Moja odpowiedź jest nadal aktualna dla QGIS 3.8 (Zanzibar).
swatchai