QGIS için basit bir python betiği dışarıdan nasıl çalıştırılır (örn. Sublime Text)?


37

QGIS (Mac) için QGIS'in "dışından" birkaç küçük ve basit python komut dosyası çalıştırmak istiyorum. Dışsal ile bu bağlamda, normal os komut satırı (terminal.app) veya hatta daha iyisi, doğrudan Sublime Text (metin editörü) dışında, ancak kesinlikle yerleşik QGIS python konsolu aracılığıyla değil.

Ben baştan sona kadar okuduktan çeşitli öğretici örn http://www.qgis.org/pyqgis-cookbook/intro.html#python-applications ve ben QGIS app bir başvuru almak mümkün, ama ne yazık değil değilim qgis.utils.ifaceya da başka derin bir şey . Bu küçük kod pasajı, örneğin aktif katmanın adını basmalıdır ... işte sahip olduğum şey:

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

Lütfen şimdi nasıl bir eklenti veya "ağır" başka bir şey yaratacağımı cevaplamayın. QGIS'e rahat bir metin editöründen senaryolar çekmenin kolay ve hızlı bir yolunu arıyorum.

Yanıtlar:


32

ifaceBuradaki nesneye başvuru alamazsınız çünkü bu bağlamda mevcut değildir. iface( QgisInterface) Nesnesi kolaylık eklentileri için nesne veya ana nesneler vb, harita tuval, efsane, besteci örneğin erişmek için, QGIS içinde çalışan komut olduğunu ve ana uygulama çalışırken sadece mevcut.

QGIS API'lerini kullanarak bağımsız bir Python betiği oluşturduğunuzda, bunlardan hiçbiri bulunmaz çünkü kendi haritalama uygulamanızı yaparsınız.

Üç farklı durum vardır:

  1. Bir QGIS eklentisi
  2. Otomasyon için QGIS'in içinde çalışan bir komut dosyası (eklenti değil)
  3. QGIS API'larını kullanan bağımsız uygulama

1.ve sonuncusu, 2.erişemez iface.

Çünkü 3bir harita tuvalinde bir katman açan bir komut dosyası oluşturmak istiyorsanız, bunu sonraQgsApplication.initQgis()

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

Ancak, eğer gerçekten böyle bir şey arıyorsanız, 2bunu sadece script editörünüze yazabilirsiniz.

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

qgis.utils.iface.activeLayer()

ancak bunun çalışması için QGIS içinde çalıştırılması qgis.utilsgerekiyor. Bu komut dosyasını Python konsolunda açıp PATHçalıştırarak import scriptnameveya ScriptRunner eklentisini kullanarak yapılabilir.

Aşağıdakilerin henüz QGIS olmadığını unutmayın.

Henüz 4eklenmemiş bir sayı var ve umarım gelecekte olacak ve bu kodu çalıştırmak için QGIS'i bir komut satırı argümanı ile çalıştırma seçeneğidir.

Örneğin:

qgis --code=mycodefile.py

Eklenti günlüğü (sürüm 1.8)

QGIS günlük penceresine bilgi kaydetmek için QgsMessageLog sınıfını kullanabilirsiniz. Sağ alt köşedeki sarı ünlem işareti.

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

veya lambda kullanmadan

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

Lambda bazlı olanı tercih etmek isterim ki herhangi bir zamanda kayıt yapmak istediğinizde daha kısa ve daha az yazı yazmak.


Açıklama ve hızlı cevap için teşekkür ederiz! O zaman seçenek için umutsuzca bekliyorum 4. Bu arada birlikte yaşamak zorundayım 2, ki bunu import scriptizleyen her zaman gerçekten acı reload(script)verici ve elbette editörümden QGIS'e geçiyor. Ayrıca umut verici olan scriptrunner eklentisini de kontrol ettim, ancak daha sonra print "debug value"QGIS konsoluna hiçbir şey bulamadım . Herhangi bir şans eseri, bir komut dosyası yazıcısının QGIS konsoluna bir şey yazması için bir yol biliyor musunuz? Çok teşekkürler! Cevabınızı bekleyecek ve daha sonra soruyu kapatın!
Benedikt Groß

Python konsolu gerçekten bu tür çıktılar için tasarlanmamıştır, sadece giriş için. Yapabilecekleriniz QGIS log penceresine giriş yapmak. Bunu açıklamak için cevaba ekleyecektir.
Nathan W

Teşekkürler! Bu son derece yararlıdır. geçici def info(text): QMessageBox.information(None,"Debug Info", str(text))
çözümüm

yazım hatası:QgsVector_y_Layer
Nick Volynkin

14

Bence Nathan W'ın cevabı güncel değil. Aşağıdaki komutları kullanarak QGIS (sürüm 2.6) python komut dosyalarını komut satırından (Nathan'ın seçenek 4) çalıştırabildim.

man qgis
qgis -nologo --project /path/foo.qgs --code /path/foo.py

Bu işe yarıyor ama sadece "ipucu" penceresini kapattıktan sonra ... arayüzü tamamen devre dışı bırakmanın ve sadece --codepython betiğini çalıştırmanın bir yolu var mı?
Anthony O.

5

Nathan'ın 4. seçeneği için güncelleme: (Windows, QGIS 2.18 Las Palmas)

QGIS yardım belgesini yazdırmak için,

qgis --help

QGIS'i açmak için bir proje yükleyin, sonra bir python betiği çalıştırın.

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

Bu komutlar OSGeo4W Shell'de sorunsuz çalışmalıdır.


1
Cevabım QGIS 3.8 (Zanzibar) için hala geçerli.
swatchai
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.