Bagaimana menjalankan skrip python sederhana untuk QGIS dari luar (mis. Sublime Text)?

37

Saya ingin menjalankan beberapa skrip python kecil dan sederhana untuk QGIS (Mac) dari "luar" QGIS. Dengan luar yang saya maksudkan dalam konteks ini, baik baris perintah os normal (terminal.app) atau bahkan lebih baik, langsung keluar dari Sublime Text (text-editor), tetapi jelas tidak melalui konsol python QGIS inbuilt.

Saya sudah membaca berbagai tutorial misal http://www.qgis.org/pyqgis-cookbook/intro.html#python-aplikasi dan saya bisa mendapatkan referensi ke aplikasi QGIS, tapi sayangnya tidak ke qgis.utils.ifaceatau sesuatu yang lebih dalam . Cuplikan kode kecil ini, misalnya, harus mencetak nama lapisan yang aktif ... inilah yang saya miliki:

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

Tolong jangan balas saya sekarang bagaimana membuat plugin atau sesuatu yang "berat". Saya hanya mencari cara cepat dan mudah untuk mengambil skrip dari editor teks yang nyaman ke QGIS.

Benedikt Groß
sumber

Jawaban:

32

Anda tidak bisa mendapatkan referensi ke ifaceobjek di sini karena tidak ada dalam konteks ini. The iface( QgisInterface) objek adalah objek kemudahan bagi plugin, atau script berjalan di dalam QGIS, untuk mengakses objek utama misalnya peta kanvas, legenda, komposer, dll, dan hanya ada ketika aplikasi utama sedang berjalan.

Saat Anda membuat skrip Python mandiri menggunakan API QGIS, semua ini tidak ada karena Anda membuat aplikasi pemetaan sendiri.

Ada tiga situasi berbeda:

  1. Plugin QGIS
  2. Sebuah skrip yang berjalan di dalam QGIS (bukan plugin) untuk otomatisasi
  3. Aplikasi mandiri menggunakan API QGIS

1.dan 2.memiliki akses ke iface, yang terakhir tidak.

Karena 3jika Anda ingin membuat skrip yang membuka lapisan di kanvas peta Anda akan melakukan ini setelahQgsApplication.initQgis()

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

Namun jika Anda benar-benar mencari sesuatu seperti 2maka Anda bisa menulis ini di editor skrip Anda

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

qgis.utils.iface.activeLayer()

tetapi ini harus dijalankan di dalam QGIS agar qgis.utilsdapat berfungsi. Itu bisa dilakukan dengan meletakkan skrip PATHdan menjalankannya import scriptnamedi konsol Python atau dengan menggunakan plugin ScriptRunner.

Perhatikan bahwa yang berikut ini belum QGIS

Ada nomor 4yang belum ditambahkan, dan mudah-mudahan akan ada di masa depan, dan itu adalah opsi untuk menjalankan QGIS dengan arg baris perintah untuk mengatakan jalankan kode ini.

Sebagai contoh:

qgis --code=mycodefile.py

Plugin logging (versi 1.8)

Anda dapat menggunakan kelas QgsMessageLog untuk mencatat informasi ke jendela log QGIS. Tanda seru kuning di sudut kanan bawah.

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

atau tanpa menggunakan lambda

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

Saya lebih suka yang berbasis lambda karena lebih pendek dan kurang mengetik setiap kali Anda ingin mencatat sesuatu.

Nathan W
sumber
Terima kasih atas klarifikasi dan jawaban cepatnya! maka saya sedang menunggu pilihan 4. Sementara itu saya harus hidup dengan 2, yang benar-benar menyusahkan sepanjang waktu import scriptdiikuti reload(script)dan tentu saja berubah dari editor saya ke QGIS. Saya juga memeriksa plugin scriptrunner, yang menjanjikan tetapi kemudian saya tidak bisa mendapatkannya print "debug value"di konsol QGIS. Apakah Anda tahu, bagaimana pun, suatu cara bagaimana membuat skrip scriptrunner mencetak sesuatu ke konsol QGIS? Terimakasih banyak! Akan menunggu balasan Anda dan kemudian menutup pertanyaan!
Benedikt Groß
Konsol python tidak benar-benar dimaksudkan untuk output semacam itu, lebih hanya untuk input. Yang dapat Anda lakukan adalah masuk ke jendela log QGIS. Akan menambah jawaban untuk menjelaskan ini.
Nathan W
Terima kasih! itu sangat membantu. solusi saya adalah menyalahgunakan popup untuk memiliki hasil debugdef info(text): QMessageBox.information(None,"Debug Info", str(text))
Benedikt Groß
salah ketik:QgsVector_y_Layer
Nick Volynkin
14

Saya pikir jawaban Nathan W sudah ketinggalan zaman. Saya bisa menjalankan skrip python QGIS (versi 2.6) dari baris perintah (opsi Nathan 4) menggunakan perintah berikut.

man qgis
qgis -nologo --project /path/foo.qgs --code /path/foo.py
jsta
sumber
Ini berfungsi tetapi hanya setelah saya menutup jendela "tips" ... apakah ada cara untuk menonaktifkan antarmuka sepenuhnya dan hanya menjalankan --codeskrip python?
Anthony O.
5

Pembaruan untuk opsi Nathan 4: (Windows, QGIS 2.18 Las Palmas)

Untuk mencetak dokumen bantuan QGIS,

qgis --help

Untuk membuka QGIS, muat proyek, lalu jalankan skrip python.

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

Perintah-perintah ini harus dijalankan pada OSGeo4W Shell tanpa masalah.

swatchai
sumber
1
Jawaban saya masih berlaku untuk QGIS 3.8 (Zanzibar).
swatchai