QGIS用のシンプルなPythonスクリプトを外部から実行するには(Sublime Textなど)?


37

QGISの「外部」からQGIS(Mac)用の小さくてシンプルなpythonスクリプトをいくつか実行したいと思います。外部とは、このコンテキストでは、通常のosコマンドライン(terminal.app)またはそれ以上、Sublime Textから直接(テキストエディター)を意味しますが、組み込みのQGIS pythonコンソール経由ではありません。

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このコンテキストには存在しないため、ここでオブジェクトへの参照を取得することはできません。ifaceQgisInterface)オブジェクトは、メインオブジェクトにアクセスするために、QGIS内で実行されているプラグイン、またはスクリプトのための便利なオブジェクトであり、マップキャンバス、凡例、作曲などを、例えば、メインアプリケーションが実行されている場合にのみ存在します。

独自のマッピングアプリケーションを作成しているため、QGIS APIを使用してスタンドアロンPythonスクリプトを作成する場合、このようなものは存在しません。

3つの異なる状況があります。

  1. QGISプラグイン
  2. 自動化のために(プラグインではなく)QGIS内で実行されるスクリプト
  3. QGIS APIを使用したスタンドアロンアプリ

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。これは、スクリプトをPythonコンソールに配置してPATH実行import scriptnameするか、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コンソールに何かを印刷する方法を知っていますか?どうもありがとう!返信を待ってから質問を閉じます!
ベネディクトグロス

Pythonコンソールは、実際にはそのような出力用ではなく、入力用です。できることは、QGISログウィンドウにログを記録することです。これを説明する回答に追加されます。
ネイサンW

ありがとう!それは非常に役立ちます。私の問題を回避するには、デバッグ出力を持つために、ポップアップを乱用することだったdef info(text): QMessageBox.information(None,"Debug Info", str(text))
ベネディクト・グロース

タイプミス:QgsVector_y_Layer
ニックヴォリンキン

14

Nathan Wの答えは時代遅れだと思います。次のコマンドを使用して、コマンドライン(Nathanのオプション4)からQGIS(バージョン2.6)pythonスクリプトを実行できました。

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

これは機能しますが、「ヒント」ウィンドウを閉じた後にのみ...インターフェイスを完全に無効にして--codePythonスクリプトを実行する方法はありますか?
アンソニーO.

5

Nathanのオプション4の更新:(Windows、QGIS 2.18 Las Palmas)

QGISヘルプドキュメントを印刷するには、

qgis-ヘルプ

QGISを開くには、プロジェクトをロードしてから、Pythonスクリプトを実行します。

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

これらのコマンドは、OSGeo4Wシェルで問題なく実行されるはずです。


1
私の答えは、QGIS 3.8(Zanzibar)でも有効です。
swatchai
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.