如何从外部运行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。

Answers:


32

您无法在iface此处获得对该对象的引用,因为该对象在此上下文中不存在。在ifaceQgisInterface)对象是为插件便利对象,或内部QGIS运行,以访问主对象,例如在地图上帆布,图例,作曲家等的脚本,并且主应用程序运行时只存在。

当使用QGIS API创建独立的Python脚本时,这些东西都不存在,因为您正在制作自己的地图绘制应用程序。

有三种不同的情况:

  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控制台中PATHimport 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')

或不使用lambda

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

我更喜欢基于lambda的lambda,因为它更短并且在您想要记录任何内容时都更少键入。


感谢您的澄清和迅速的答复!然后我拼命等待选择4。在此期间,我不得不与一起住2,这一直是一个痛苦的过程,import script其后一直是reload(script)我的编辑器向QGIS的转变。我还检查了scriptrunner插件,该插件很有前途,但后来我无法将其print "debug value"插入QGIS控制台。您是否知道如何让scriptrunner脚本将某些内容打印到QGIS控制台?非常感谢!将等待您的答复,然后关闭问题!
BenediktGroß12年

python控制台并不是真正意义上的那种输出,更多的是用于输入。您可以做的就是登录到QGIS日志窗口。将添加到答案中对此进行解释。
内森·W

谢谢!这非常有帮助。我的解决方法是滥用弹出窗口以产生调试输出def info(text): QMessageBox.information(None,"Debug Info", str(text))
BenediktGroß2012年

错字:QgsVector_y_Layer
Nick Volynkin

14

我认为Nathan W的答案已经过时。我能够使用以下命令从命令行(Nathan的选项4)运行QGIS(2.6版)python脚本。

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

这是可行的,但是只有在我关闭“提示”窗口之后,...才可以完全禁用该接口并仅执行--codepython脚本吗?
Anthony O.

5

Nathan选项4的更新:(Windows,QGIS 2.18 Las Palmas)

要打印QGIS帮助文档,

qgis-帮助

要打开QGIS,请加载项目,然后运行python脚本。

qgis --nologo-项目c:/path/to/projfile.qgs-代码c:/path/to/code.py

这些命令应在OSGeo4W Shell上运行而不会出现问题。


1
我的答案对于QGIS 3.8(Zanzibar)仍然有效。
swatchai
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.