需求
项目需要对openstack的某些组件进行二次开发,但是openstack组件都安装在服务器上,在服务器调试比较麻烦,因此想在本地通过pycharm进行调试。
本方案不仅适用于调试openstack,适用于使用pycharm调试任何项目代码
环境
pycharm
服务器:ubuntu18.04
openstack: stable/stein
pycharm配置
打开pycharm,创建一个项目,注意该项目是要和服务器项目文件对应的,因此命名自行注意即可。本项目以zun-dev命名,因为要调试zun组件
SFTP配置
点击ok 创建完成
从服务器下载代码(注意这里是因为服务器先有代码,如果是本地先有代码则是先将代码上传到服务器)
远程解释器配置
至此python解释器使用的是服务器的解释器
远程debug配置
注意上图中的pydevd插件,安装时按照当前的pycharm版本在服务器上安装即可。
如果服务器无法联网,则需要将本机文件上传,文件在
将pydevd-pycharm.egg
文件上传到服务器任意位置,如果能安装则安装,不过不建议,很可能安装失败。后续会有说明如何使用
远程debug
从前边配置debug时,能够看到pydevd的使用说明,代码如下:
# 该代码是当通过pip安装pydevd插件时的写法
import pydevd_pycharm
pydevd_pycharm.settrace('172.30.2.168', port=54321, stdoutToServer=True, stderrToServer=True) # 这里的ip和port就是之前配置的
# 下边代码是将pydevd-pycharm.egg上传至服务器时的写法,假设文件上传至服务器的/opt/debug-egg/目录中
import sys
sys.path.append("/opt/debug-egg/pydevd-pycharm.egg")
import pydevd_pycharm
pydevd_pycharm.settrace('172.20.208.95', port=12345, stdoutToServer=True, stderrToServer=True)
只需要将如上代码添加到需要调试的地方,然后将代码上传至服务器。
点击debug图标
会显示等待连接
服务器重启该服务的代码,等到运行到调试代码处时,会出现如下情况
可以看到已经建立连接
之后就可以正常调试了,也可以正常打断点。
如果不能在调试代码处停下,可能是因为多线程导致的。可以尝试如下方法,本例以zun源码演示
在源代码的cmd/__init__.py
中修改
import eventlet
eventlet.monkey_patch(os=False, thread=False) # 这是修改后代码
#eventlet.monkey_patch() # 这是原始代码
其他服务一般也有类似的配置项
参考
https://www.jetbrains.com/help/pycharm/remote-debugging-with-product.html