我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文中,苏南大叔所描述的观点,来自于个人的理解,可能和大多数人的认知不符。如果您对本文观点持有不同意见,欢迎留言给我。

苏南大叔:pycharm如何通过pydevd单步调试qgis插件? - pycharm-qgis-step
pycharm如何通过pydevd单步调试qgis插件?(图9-1)

试环境:qgis@3.16.14pycharm@2021.2.3(professional)pydevd-pycharm@212.5457.59。本文中,默认您已经安装并配置好了相关环境,如果您还没有配置好这些环境,请参考文末连接。当然,苏南大叔相信:如果您仅仅是调试普通python程序的话,本文也是有一定的参考意义的。

开始调试代码

根据pycharm在添加debug server这一步的提示,苏南大叔获得了开始调试的语句。如下:

import pydevd_pycharm
pydevd_pycharm.settrace('localhost', port=53100, stdoutToServer=True, stderrToServer=True)

当然,注意根据实际情况修改localhost53100字样。

苏南大叔:pycharm如何通过pydevd单步调试qgis插件? - pydevd-pycharm-settrace
pycharm如何通过pydevd单步调试qgis插件?(图9-2)

开始调试的时机

在本文中,因为调试的是qgis插件,而qgis本身也是基于python编写的的。这个devd也是以第三方包的形式,存在于qgis自带的site-packages里面的。

也就是说:调试插件的时候,代码范围可没有限定在插件里面。整个qgis都处于被调试中!断点调试的时候,会进入到qgis相关代码里面。

苏南大叔:pycharm如何通过pydevd单步调试qgis插件? - debug-error
pycharm如何通过pydevd单步调试qgis插件?(图9-3)

那么,开始调试的时机就显得很重要,如果把开始调试的代码放到了目标插件的初始化阶段,那么就会出现2个极端。

  • pycharmdebug模式先于qgis启动,那么,qgis会假死。需要pycharm里面执行单步调试的run to cursor:alt+f9跳出。
  • qgis先于pycharmdebug模式启动,那么,会直接报错,pydevd并没有监听到。

如果把开始调试的代码,放到目标插件的初始化阶段之后触发。那么,似乎可行。不过,代码似乎是有污染插件工程的嫌疑。毕竟开始调试的动作,是通过执行代码来控制的。

苏南大叔:pycharm如何通过pydevd单步调试qgis插件? - pydevd-pycharm-debug-plugin
pycharm如何通过pydevd单步调试qgis插件?(图9-4)

如果把代码放到第三方插件里面,个人觉得是个不错的选择,在qgis的插件库里面,也有个类似的插件,叫做Remote Debug。但是它不支持pycharm,当然,您可以对它进行修改。

苏南大叔:pycharm如何通过pydevd单步调试qgis插件? - debug-plugin-next
pycharm如何通过pydevd单步调试qgis插件?(图9-5)

如果把代码放到qgispython命令行里面执行,则会非常灵活。但是总是要复制代码,也是很麻烦不是。

苏南大叔:pycharm如何通过pydevd单步调试qgis插件? - settrace
pycharm如何通过pydevd单步调试qgis插件?(图9-6)

结束调试代码

pydevd-charm并每天提供结束监听(调试)的功能,但是经过苏南大叔查阅文档发现:pydevd是有提供类似功能的,叫做stoptrace()。另外,这个结束代码的执行时机,也一样可以在qgis的任何地方执行,所以,一样有合理的想象空间。

修改pydevd-pycharm

这个操作需要修改第三方包,对于python体系来说,这种操作是并不推荐的。但是,对于本需求来说,这个操作最实用!
pydevd-pycharm.py

# make settrace() function available for `pydevd_pycharm`
from pydevd import settrace
from pydevd import stoptrace
from _pydevd_bundle.pydevd_comm import VERSION_STRING
__version__ = VERSION_STRING

苏南大叔:pycharm如何通过pydevd单步调试qgis插件? - stoptrace
pycharm如何通过pydevd单步调试qgis插件?(图9-7)

调用代码是:

import pydevd_pycharm
pydevd_pycharm.stoptrace()

不修改pydevd-charm

如果不修改pydevd-charm这个包,其实也可以直接引用pydevd,就是代码看起来并不好看。代码如下:

from pydevd import stoptrace
stoptrace()

苏南大叔:pycharm如何通过pydevd单步调试qgis插件? - stoptrace-2
pycharm如何通过pydevd单步调试qgis插件?(图9-8)

pycharm单步快捷键

在项目代码里面打好断点,然后通过合适的时机执行settrace()之后,就可以单点调试了。值得注意的是:可能会调试进去qgis的系统代码,记得及时跳出。

  • step over:f8,在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完在停止,也就是把子函数整个作为一步。
  • step into:f7,单步执行,遇到子函数就进入并且继续单步执行。
  • step out:shift+f8,在单步执行到子函数内时,用Step Return就可以执行完子函数余下部分,并返回上一层函数。
  • step into my code:alt+shift+f7,当step into到系统代码里面后,从系统代码快速返回到当前项目代码。
  • run to cursor:alt+f9,对付qgis界面假死的神器,把鼠标定位到合适代码,然后快速执行到这个不会假死的代码位置。

苏南大叔:pycharm如何通过pydevd单步调试qgis插件? - debug-step-icons
pycharm如何通过pydevd单步调试qgis插件?(图9-9)

相关链接

总结

更多qgis插件的相关文章,请点击苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    qgis