我已经阅读了各种教程,例如http://www.qgis.org/pyqgis-cookbook/intro.html#python-applications,我能够获得对QGIS应用程序的引用,但不幸的是,没有对
qgis.utils.iface
或其他更深层次的内容的引用。例如,这个小代码段应打印出活动层的名称...这就是我所拥有的内容:创建一个插件或其他“沉重”的东西。我只是在寻找一种快速便捷的方法,将脚本从舒适的文本编辑器拍摄到QGIS。
#1 楼
您无法在此处获得对iface
对象的引用,因为它在此上下文中不存在。 iface
(QgisInterface
)对象是用于在QGIS内部运行的插件或脚本访问主要对象的便捷对象,例如地图画布,图例,作曲家等,并且仅在主应用程序运行时存在。当您使用QGIS API创建独立的Python脚本时,这些东西都不存在,因为您是在制作自己的东西映射应用程序。
有三种不同的情况:
QGIS插件
在QGIS(不是插件)中运行以实现自动化的脚本
使用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
正常工作。可以通过将脚本放在PATH
上并在Python控制台中运行import scriptname
或使用ScriptRunner插件来完成。请注意,以下内容还不是QGIS
有一个尚未添加的数字
4
,希望将来会出现,并且可以使用命令行arg来运行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的代码,因为它更短且您每次想记录某些内容时都更少键入。
#2 楼
我认为Nathan W的答案已经过时。我能够使用以下命令从命令行(Nathan的选项4)运行QGIS(2.6版)python脚本。man qgis
qgis -nologo --project /path/foo.qgs --code /path/foo.py
评论
这是有效的,但是只有在我关闭“提示”窗口之后……是否可以完全禁用该接口并仅执行--code python脚本?
– Anthony O.
18年7月10日在13:17
#3 楼
弥敦道选项4的更新:(Windows,QGIS 2.18 Las Palmas)要打印QGIS帮助文档,
qgis --help
/>
要打开QGIS,请先加载一个项目,然后运行python脚本。
qgis --nologo --project c:/path/to/projfile.qgs --code c:/path/to/code.py
这些命令应该可以在OSGeo4W Shell上正常运行。
评论
我的答案对于QGIS 3.8(Zanzibar)仍然有效。
–swatchai
19-10-8的15:39
评论
感谢您的澄清和迅速的答复!然后我拼命地等待着选项4。与此同时,我不得不忍受着2的困扰,这一直很麻烦,因为我一直在执行导入脚本,然后执行reload(script),当然也要从编辑器更改为QGIS。我还检查了scriptrunner插件,该插件很有希望,但是后来我无法在QGIS控制台上获得任何打印“调试值”。您是否知道如何让scriptrunner脚本将某些内容打印到QGIS控制台?非常感谢!将等待您的答复,然后关闭问题!
– BenediktGroß
2012年7月16日17:06
python控制台并不是真正意义上的那种输出,而是更多地用于输入。您可以做的就是登录到QGIS日志窗口。将添加到答案中对此进行解释。
–内森·W
2012年7月17日在2:06
谢谢!这非常有帮助。我的解决方法是滥用弹出窗口以获取调试输出def info(text):QMessageBox.information(None,“ Debug Info”,str(text))
– BenediktGroß
2012年7月17日在12:48
错字:QgsVector_y_Layer
–尼克·沃伦金(Nick Volynkin)
16-10-7在7:16