PyCharm远程调试Python的三种方式

时间:2024-05-19 12:46:43

版权声明:本文为博主原创文章,未经博主允许不得转载。

在使用PySpark开发集群任务时,由于集群资源访问权限的限制,只能在开发机上运行,本地无法自测。

开发机上调试的时候,可通过在开发机上启动spark shell进行交互式调试,但需要把写好的代码按顺序复制进spark shell中才能调试。这样做不仅要把写好的代码再按照spark shell格式整理一遍,对于结构比较复杂的代码,更耗时耗力,而且容易出错。另一方面,由于考虑到要在spark shell中调试,会有意无意把代码的结构写的简单,便于代码复制,即为了便于调试舍弃代码的抽象化、模块化、结构化。

在开发机上虽然可以通过 python pdb 单步调试,但不够直观,效率也不是很高。

自然而然的想到了能不能在本机进行开发机的远程调试。本文列举出三种方式解决远程调试。

一、PyCharm 的 Python Remote Debug

在Python Remote Debug的模式下,PyCharm(IDE)作为服务端(Server)启动调试,开发机则作为客户端(Client)启动。

因此使用 PyCharm 的 Python Remote Debug 进行远程调试,需要在本地开发环境中设定 IP 和端口并启动,PyCharm 会对设定的端口进行监听,等待客户端连接请求。

具体步骤如下:

1. 开发机上安装 pydevd

PyCharm 对于 Python Remote Debug 远程调试提供了pydevd模块,在 PyCharm 安装路径下的debug-eggs文件夹下,pycharm-debug.egg用于Python2,pycharm-debug-py3k.egg则用于Python3。

  • 可直接在开发机上 pip install pydevd
  • 若无权限可将 pycharm-debug.egg 复制到开发机,把该文件添加到Python引用路径中
    如 export PYTHONPATH=$PYTHONPATH:/home/…/pycharm-debug.egg

可启动Python,输入import pydevd,没报错说明安装成功

开发机安装该库后,就可以调用pydevd.settrace方法,该方法会指定 IDE 所在机器的 IP 和监听端口号,用于与IDE建立连接;建立连接后,便可在IDE中对开发机中的程序进行单步调试。

2.本地PyCharm配置Python Remote Debug

Python Remote Debug配置如下:

  • 【Run】->【Edit Configurations】->【Add New Configuration】->【Python Remote Debug】

  • 填写Local host namePort,其中Local host name指的是本机开发环境的IP地址,而Port则随便填写一个10000以上的即可

    Windows可直接用ipconfig命令查看IPv4地址,对于使用v*n,Local host name则为v*n适配器的IPv4地址
    由于开发机需要连接至本地开发环境,因此要保证开发机可以访问本地IP,可直接在开发机 ping 本地ip验证

  • 配置 Path mappings,Local path 为项目在本地的位置,Remote path为项目在开发机的位置
    PyCharm远程调试Python的三种方式

  • 【Apply】and【OK】

PyCharm远程调试Python的三种方式

3.在开发机需要调试的代码中加入调试监控代码

将配置好的Python Remote Debug中的 Update your script 下方代码插入至开发机的代码中

import pydevd
pydevd.settrace('10.4.×.×', port=11234, stdoutToServer=True, stderrToServer=True)

注意如果在开发机源代码中插入两行调试监控代码,也需要在本地代码的相应位置中插入两行(空行即可),否则远程调试断点会串行。

4.本地 PyCharm 启动 Debug Server

在待远程调试的代码中打好断点

选中配置好的Python Remote Debug,进行 Debug,启动并处于监听状态,在 Console 中显示如下:

Starting debug server at port 11234
Use the following code to connect to the debugger:
import pydevd
pydevd.settrace('10.4.×.×', port=11234, stdoutToServer=True, stderrToServer=True)
Waiting for process connection...

5.开发机中运行配置好的Python代码

使用脚本启动应用程序,执行到pydevd.settrace时,便会与本地开发环境中的PyCharm建立通讯连接

如下图所示,就可以在本地 PyCharm 中打断点单步调试了

PyCharm远程调试Python的三种方式

可以查看spark dataframe的参数属性

PyCharm远程调试Python的三种方式

通过Evaluate调试并查看结果

PyCharm远程调试Python的三种方式

在开发机中,就会等待本地单步调试进度,执行并打印日志

PyCharm远程调试Python的三种方式

二、使用 PyCharm 远程解释器

参照博文 Pycharm配置远程调试,通过 远程部署配置远程解释器配置 实现远程调试,以下图片摘自这篇文章。

但不论是部署还是解释器配置,都需要远程开发机的账号、密码,由于公司是通过堡垒机登陆开发机,无法使用该方法。

PyCharm远程调试Python的三种方式

PyCharm远程调试Python的三种方式

三、IDEA的Remote和使用JVM的Xdebug

如果语言使用Java或Scala,IDE使用IntelliJ IDEA,可以使用使用JVM的Xdebug和IDEA的Remote进行远程调试。

可参照 idea远程调试 spark ,相对较简单。该方式正好与 PyCharm 中的Python Remote Debug模式相反,开发机作为服务端(Server)启动调试,本地IntelliJ IDEA则作为客户端(Client)启动。

但对于Python来说,即使用IDEA编辑Python,使用该方式,虽然可以和开发机调通,但无法实现断点单步调试。

PyCharm远程调试Python的三种方式

参考文章:

利用PyCharm进行Python远程调试

Pycharm配置远程调试

idea远程调试 spark


--------------------------文档信息--------------------------
版权声明:本文为博主原创文章,未经博主允许不得转载
署名(BY) :dkjkls(dkj卡洛斯)
文章出处:http://blog.****.net/dkjkls