16.3. 用于编写和调试插件的IDE设置

尽管每个程序员都有自己喜欢的IDE/文本编辑器,但以下是设置流行的IDE以编写和调试QGIS Python插件的一些建议。

16.3.1. 用于编写Python插件的有用插件

有些插件在编写Python插件时很方便。从… Plugins ► Manage and Install plugins… ,安装:

  • Plugin reloader :这将允许您在不重新启动QGIS的情况下重新加载插件并获取新的更改。

  • First Aid :这将添加一个Python控制台和本地调试器,以便在插件引发异常时检查变量。

警告

Despite our constant efforts, information beyond this line may not be updated for QGIS 3. Refer to https://qgis.org/pyqgis/master for the python API documentation or, give a hand to update the chapters you know about. Thanks.

16.3.2. 关于在Linux和Windows上配置IDE的说明

On Linux ,通常需要做的就是将QGIS库位置添加到用户的 PYTHONPATH 环境变量。在大多数发行版中,这可以通过编辑来完成 ~/.bashrc~/.bash-profile 使用以下代码行(在OpenSUSE Tumbleeed上进行测试):

export PYTHONPATH="$PYTHONPATH:/usr/share/qgis/python/plugins:/usr/share/qgis/python"

使用以下Shell命令保存文件并实施环境设置:

source ~/.bashrc

On Windows ,您需要确保您具有与QGIS相同的环境设置和使用相同的库和解释器。最快的方法是修改QGIS的启动批处理文件。

If you used the OSGeo4W Installer, you can find this under the bin folder of your OSGeo4W install. Look for something like C:\OSGeo4W\bin\qgis-unstable.bat.

16.3.3. 使用PySCRIPTER IDE进行调试(Windows)

用于使用 Pyscripter IDE ,这是你必须做的:

  1. 复制…的副本 qgis-unstable.bat 并将其重命名 pyscripter.bat

  2. 在编辑器中打开它。并删除最后一行,即启动QGIS的那一行。

  3. 添加指向可执行文件的一行,并添加设置要使用的Python版本的命令行参数

  4. 还可以添加指向文件夹的参数,在该文件夹中,您可以在OSGeoW安装的bin文件夹下找到由QGIS使用的PythonDLL

    @echo off
    SET OSGEO4W_ROOT=C:\OSGeo4W
    call "%OSGEO4W_ROOT%"\bin\o4w_env.bat
    call "%OSGEO4W_ROOT%"\bin\gdal16.bat
    @echo off
    path %PATH%;%GISBASE%\bin
    Start C:\pyscripter\pyscripter.exe --python25 --pythondllpath=C:\OSGeo4W\bin
    
  5. 现在,当您双击该批处理文件时,它将使用正确的路径启动PyScripter。

在开发人员中,更受欢迎的是Eclipse,它比Py脚本编写程序更流行。在接下来的部分中,我们将解释如何配置它来开发和测试插件。

16.3.4. 使用Eclipse和PyDev进行调试

16.3.4.1. 安装

要使用Eclipse,请确保您已经安装了以下软件

  • Eclipse

  • Aptana Studio 3 Plugin or PyDev

  • QGIS2.x

  • 您可能还希望安装 Remote Debug ,这是一个QGIS插件。目前,它仍处于实验阶段,因此启用 复选框 Experimental plugins 在……下面 Plugins ► Manage and Install plugins... ► Options 在此之前。

要使您的环境为在Windows中使用Eclipse做好准备,您还应该创建一个批处理文件并使用它来启动Eclipse:

  1. Locate the folder where qgis_core.dll resides in. Normally this is C:\OSGeo4W\apps\qgis\bin, but if you compiled your own QGIS application this is in your build folder in output/bin/RelWithDebInfo

  2. 找到您的 eclipse.exe 可执行的。

  3. 创建以下脚本,并在开发QGIS插件时使用该脚本启动ECLIPSE。

    call "C:\OSGeo4W\bin\o4w_env.bat"
    set PATH=%PATH%;C:\path\to\your\qgis_core.dll\parent\folder
    start /B C:\path\to\your\eclipse.exe
    

16.3.4.2. 设置Eclipse

  1. 在Eclipse中,创建一个新项目。您可以选择 General Project 并在以后链接你的真实资源,所以你把这个项目放在哪里并不重要。

    ../../../_images/eclipsenewproject.png

    图 16.111 Eclipse项目

  2. 右键单击您的新项目,然后选择 New ► Folder

  3. 单击 Advanced 并选择 Link to alternate location (Linked Folder) 。如果您已经有要调试的源代码,请选择这些。如果没有,请按照前面所解释的那样创建一个文件夹。

现在,在视图中 Project Explorer ,您的源代码树将弹出,您可以开始使用代码。您已经拥有了语法突出显示和所有其他可用的强大IDE工具。

16.3.4.3. 配置调试器

要使调试器正常工作,请执行以下操作:

  1. 切换到Eclipse中的Debug透视图 (Window ► Open Perspective ► Other ► Debug )。

  2. 通过选择以下命令启动PyDev调试服务器 PyDev ► Start Debug Server

  3. 现在,eclipse正在等待从QGIS到它的调试服务器的连接,当QGIS连接到调试服务器时,它将允许它控制Python脚本。这正是我们安装的 Remote Debug 插件。因此,如果您还没有启动QGIS,请单击错误符号。

现在您可以设置断点,一旦代码命中断点,执行将停止,您可以检查插件的当前状态。(断点是下图中的绿色圆点,通过在您希望设置断点的行左侧的空白处双击来设置一个断点)。

../../../_images/breakpoint.png

图 16.112 断点

现在您可以使用的一个非常有趣的东西是调试控制台。在继续执行之前,请确保当前在中断点处停止执行。

  1. 打开控制台视图 (Window ► Show view )。它将显示 Debug Server 游戏机,这不是很有趣。但是有一个按钮 Open Console 这使您可以切换到更有趣的PyDev Debug控制台。

  2. 单击按钮旁边的箭头 Open Console 按钮,然后选择 PyDev Console 。将打开一个窗口,询问您要启动哪个控制台。

  3. PyDev Debug Console 。如果它变灰并告诉您启动调试器并选择有效的帧,请确保您已经连接了远程调试器并且当前处于断点上。

    ../../../_images/console-buttons.png

    图 16.113 PyDev调试控制台

现在,您有了一个交互式控制台,它允许您在当前上下文中测试任何命令。您可以操纵变量或进行API调用,或者做任何您喜欢的事情。

小技巧

有点恼人的是,每次您输入命令时,控制台都会切换回Debug Server。要停止此行为,您可以单击 Pin Console 按钮,并且它应该记住这一决定,至少对于当前的调试会话。

16.3.4.4. 让eclipse理解API

一个非常方便的功能是让Eclipse真正了解QGISAPI。这使它能够检查您的代码是否有打字错误。但不仅如此,它还使Eclipse能够帮助您实现从导入到API调用的自动完成。

为此,Eclipse将解析QGIS库文件并获取其中的所有信息。您唯一需要做的就是告诉Eclipse在哪里可以找到这些库。

  1. 单击 Window ► Preferences ► PyDev ► Interpreter ► Python

    您将在窗口的上半部分(目前是用于QGIS的python2.7)和下半部分的一些选项卡中看到已配置的python解释器。我们感兴趣的选项卡有 LibrariesForced Builtins

    ../../../_images/interpreter-libraries.png

    图 16.114 PyDev调试控制台

  2. 首先打开库选项卡。

  3. 添加一个新文件夹,并选择您的QGIS安装所在的python文件夹。如果您不知道该文件夹在哪里(不是插件文件夹):

    1. 开放的QGIS

    2. 启动一个python控制台

    3. 请输入 qgis

    4. 然后按Enter键。它将向您显示它使用的QGIS模块及其路径。

    5. 去掉拖尾 /qgis/__init__.pyc 从这条路出发,你就得到了你正在寻找的路。

  4. 您还应该在此处添加您的插件文件夹(它在 python/pluginsuser profile 文件夹)。

  5. 下一步跳到 Forced Builtins 选项卡中,单击 New... 并输入 qgis 。这将使Eclipse解析QGISAPI。您可能还想让Eclipse了解有关PyQt API的信息。因此,还添加了作为强制内建的PyQt。它可能已经出现在您的库选项卡中。

  6. 单击 OK 你就完了。

备注

每次QGISAPI更改时(例如,如果您正在编译QGIS主文件并且更改了SIP文件),您应该返回到此页面并只需单击 Apply 。这将允许Eclipse再次解析所有的库。

16.3.5. 在编译好的QGIS的Ubuntu上使用PyCharm进行调试

PyCharm是JetBrains开发的一种针对Python的IDE。有一个叫做社区版的免费版本和一个叫做专业版的付费版本。您可以在以下网站下载PYCharm:https://www.jetbrains.com/pycharm/download

我们假设您已经使用给定的构建目录在Ubuntu上编译了QGIS ~/dev/qgis/build/master 。自编的QGIS并不是强制性的,但只有这一点经过了测试。必须调整路径。

  1. 在皮查姆,在你的 Project PropertiesProject Interpreter ,我们将创建一个名为 QGIS

  2. 点击小齿轮,然后 Add

  3. 选择 Virtualenv environment

  4. 为所有的Python项目选择一个通用位置,例如 ~/dev/qgis/venv 因为我们所有的插件都将使用这个Python解释器。

  5. 选择系统上可用的基于Python3的解释器,然后选中下面两个选项 Inherit global site-packagesMake available to all projects

../../../_images/pycharm-add-venv.png
  1. 单击 OK ,回到小齿轮上,然后点击 Show all

  2. 在新窗口中,选择您的新口译器 QGIS 并单击垂直菜单中的最后一个图标 Show paths for the selected interpreter.

  3. 最后,将以下绝对路径添加到列表中 ~/dev/qgis/build/master/output/python

../../../_images/pycharm-adding-path.png
  1. 重新启动PyCharm,您就可以开始对所有插件使用这个新的Python虚拟环境了。

如果您使用QGIS提供的Qt,则PyCharm将知道QGISAPI,如果您使用QGIS提供的QT API,则还会知道PyQt API from qgis.PyQt.QtCore import QDir 。自动完成应该可以工作,并且PyCharm可以检查您的代码。

在专业版的PyCharm中,远程调试运行良好。对于社区版,远程调试不可用。您只能访问本地调试器,这意味着代码必须运行 inside PyCharm(作为脚本或单元测试),而不是在QGIS本身中。对于正在运行的Python代码 in QGIS,您可以使用 First Aid 上面提到的插件。

16.3.6. 使用PDB进行调试

如果您不使用诸如Eclipse或PyCharm之类的IDE,则可以按照以下步骤使用PDB进行调试。

  1. 首先将此代码添加到您想要调试的位置

    # Use pdb for debugging
    import pdb
    # also import pyqtRemoveInputHook
    from qgis.PyQt.QtCore import pyqtRemoveInputHook
    # These lines allow you to set a breakpoint in the app
    pyqtRemoveInputHook()
    pdb.set_trace()
    
  2. 然后从命令行运行QGIS。

    在Linux上执行以下操作:

    $ ./Qgis
    

    在MacOS上执行以下操作:

    $ /Applications/Qgis.app/Contents/MacOS/Qgis
    
  3. 当应用程序到达您的断点时,您可以在控制台中键入!

TODO:

添加测试信息