pycharm如何通过pydevd单步调试qgis插件?
发布于 作者:苏南大叔 来源:程序如此灵动~本文中,苏南大叔所描述的观点,来自于个人的理解,可能和大多数人的认知不符。如果您对本文观点持有不同意见,欢迎留言给我。
试环境:qgis@3.16.14
,pycharm@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)
当然,注意根据实际情况修改localhost
和53100
字样。
开始调试的时机
在本文中,因为调试的是qgis
插件,而qgis
本身也是基于python
编写的的。这个devd
也是以第三方包的形式,存在于qgis
自带的site-packages
里面的。
也就是说:调试插件的时候,代码范围可没有限定在插件里面。整个qgis
都处于被调试中!断点调试的时候,会进入到qgis
相关代码里面。
那么,开始调试的时机就显得很重要,如果把开始调试的代码放到了目标插件的初始化阶段,那么就会出现2个极端。
pycharm
的debug
模式先于qgis
启动,那么,qgis
会假死。需要pycharm
里面执行单步调试的run to cursor:alt+f9
跳出。qgis
先于pycharm
的debug
模式启动,那么,会直接报错,pydevd
并没有监听到。
如果把开始调试的代码,放到目标插件的初始化阶段之后触发。那么,似乎可行。不过,代码似乎是有污染插件工程的嫌疑。毕竟开始调试的动作,是通过执行代码来控制的。
如果把代码放到第三方插件里面,个人觉得是个不错的选择,在qgis
的插件库里面,也有个类似的插件,叫做Remote Debug
。但是它不支持pycharm
,当然,您可以对它进行修改。
如果把代码放到qgis
的python
命令行里面执行,则会非常灵活。但是总是要复制代码,也是很麻烦不是。
结束调试代码
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
调用代码是:
import pydevd_pycharm
pydevd_pycharm.stoptrace()
不修改pydevd-charm
如果不修改pydevd-charm
这个包,其实也可以直接引用pydevd
,就是代码看起来并不好看。代码如下:
from pydevd import stoptrace
stoptrace()
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
界面假死的神器,把鼠标定位到合适代码,然后快速执行到这个不会假死的代码位置。
相关链接
- https://newsn.net/say/qgis-plugin.html
- https://newsn.net/say/pydevd-pycharm.html
- https://newsn.net/say/pycharm-python-qgis.html
- https://newsn.net/say/scrapy-debug.html
总结
更多qgis
插件的相关文章,请点击苏南大叔的博客:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。