使用 PyCharm 进行远程调试

前面几小节了介绍如何在 PyCharm 运行与调试程序,在实际工作中,我们可能还会遇到下列问题,比如做大数据分析或者机器学习过程中本地机器性能不足,有时候 Python 应用的代码在本地开发环境运行十分正常,但是放到线上以后却出现了莫名其妙的异常,在服务器系统上安装一个 IDE 肯定是不现实的,那么,是否可以将开发环境中的 IDE 与服务器环境相连,实现利用开发环境的 IDE 调试服务器环境中运行的程序呢? 答案是肯定的,这就是远程调试(Remote Debug)。PyCharm 提供了两种方式进行远程调试,下面将分别介绍。

1. 准备一个项目

在本地计算机上,创建一个纯 Python 项目,此项目添加 一个Python 文件, 将以下代码添加到 Python 文件,并命名为 sort.py

def bubble_sort(arr):
    n = len(arr)

    # 遍历所有数组元素
    for i in range(n):

        # Last i elements are already in place
        for j in range(0, n - i - 1):

            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr


if __name__ == '__main__':

    arr = [64, 34, 25, 12, 22, 11, 90]
    print(arr)
    new_arr = bubble_sort(arr)
    print(new_arr)

2. 使用远程解释器进行远程调试

运行应用程序的机器被引用为本地计算机,具有远程解释器的计算机被引用为远程计算机。

2.1 配置远程解释器

1. 确保 ssh 可以正常访问远程计算机。

2. 在 Preference/Settings,向项目添加新的远程解释器,如使用 SSH 指定,输入 IP 地址,用户名,然后 Next。
图片描述

输入密码,然后下一步:

图片描述
选择远程计算机中 Python 路径,同时可以指定本地与远程同步路径。

图片描述
点击 OK,可以看到对应的解释器路径与同步路径 ,点击 OK
图片描述
下面演示一下配置远程解释器的完整过程。

图片描述

Tips: 如果选择自动同步文件,在设置窗口关闭后,会自动登录远程 server, 输入密码,文件传输工具窗口将打开,显示传输的文件。

3. 为项目创建远程解释器后,将自动创建相应的部署配置。若要预览它, Preference/Settings -> Build,Execution,Deployment -> Deployment。这里新建了一个新的 SFTP 连接。

图片描述
点击 mapping 选项卡,可以看到本地项目到远程服务器目录映射。

图片描述

2.2 将应用程序部署到远程主机

在 Tool 菜单上,选择 Deployment -> Upload to 连接名。将显示文件传输工具窗口。如果配置远程解释器时没有选择自动同步文件,或者当文件有更新,可以通过这种方式上传文件。

图片描述
点击如图的 Browse Remote Host 可以显示服务器上的相关目录:

图片描述
然后查看远程映射目录,文件已经成功。

图片描述

2.3 调试程序

单击编辑器边栏绿色箭头,选择 Debug sort, 查看调试输出。请注意,调试实际上发生在指定的远程服务器上。
图片描述

3. 使用 Python 远程调试服务器配置进行远程调试

3.1 创建 run/debug 配置

主菜单选择 Run -> Edit Configuration , 打开 Run/debug configurations 窗口, 在工具栏选择 + 从选择列表选择 Python Debug Server。

图片描述

在远程机器上安装包 pydevd-pycharm , 除了直接通过 pip 直接安装,还可找到本地 PyCharm 安装路径下的 pydevd-pycharm.egg (mac: /Applications/PyCharm.app/Contents/debug-eggs/pydevd-pycharm.egg),拷贝这个文件到远程服务器,然后远程终端窗口执行 sudo easy_install pydevd-pycharm.egg

脚本要加两行代码

import pydevd_pycharm

pydevd_pycharm.settrace('192.168.3.14', port=12345, stdoutToServer=True,
                        stderrToServer=True)

图片描述

Tips:语句 import pydevd_pycharm 下面出现红色波浪线,是说明本地没有安装这个包,在这里不用管这个警告信息,因为这个脚本是要上传远程 server 调试的,远程 server 安装这个包就可以了。

3.2 创建 SFTP 连接

主菜单选择: Tools -> Deployment -> Configuration, 在前面我们已经创建一个连接,继续使用这个,也可以点击 + 号创建新的连接,输入远程 IP,用户名与密码即可。点击 Test Connection, 确保当前与远程服务器连通的。

图片描述

3.3 上传脚本文件到远程服务器

在本地计算机上,在 project 工具窗口中,选择文件,右键单击选择并选择 Deployment -> upload to 远程连接名,然后查看 Fi 检查文件传输对话框窗口,确保本地计算机中的文件上载到远程服务器。

图片描述

3.4 登录 debug server

选择第一步创建的 运行/调试 配置, 点击 debug 按钮, 查看 debug console 输出信息

图片描述

3.5 远程终端执行脚本

在远程计算机中启动应用程序,当执行到 pydevd.settrace 语句时,便会与本地开发环境中的 PyCharm建立通讯连接了。

cd /tmp/pycharm_project_986   # 访问远程映射的目录
python sort.py  # 运行程序,用python还是python3 根据自己的环境选择,笔者环境已经为python3建立了软链接

3.6 调试程序

在本地计算机上,切换到 debug 工具窗口。显示与 pydev 调试器的连接,这样代码实际上是在远程主机上执行的,但在本地计算机上调试。

图片描述
最后, 演示一下从上传文件到调试的过程。
图片描述

4. 小结

本小节介绍了两种远程调试的方式,二者都需要创建 SFTP 连接,都需要把程序文件上传到远程 server, 它们最大的不同是,第一种方法是在本地 PyCharm 启动程序的,需要配置远程解释器;第二种方法是在远程 server 启动程序的,需要配置 python debug server 。具体选择哪种方式进行远程调试,请根据实际的工作环境选择。

图片描述