python使用PyCharm进行远程开发和调试


Posted in Python onNovember 02, 2017

背景描述

有时候Python应用的代码在本地开发环境运行十分正常,但是放到线上以后却出现了莫名其妙的异常,经过再三排查以后还是找不到问题原因,于是就在想,要是可以在服务器环境中进行单步跟踪调试就好了。

然而,在服务器系统上安装一个IDE肯定是不现实的;通过SSH远程到服务器端,采用pdb进行调试虽然可行,但是操作还是较为繁琐,而且也不够直观。

那么,是否可以将开发环境中的IDE与服务器环境相连,实现利用开发环境的IDE调试服务器环境中运行的程序呢? 答案是肯定的,这就是远程调试(Remote Debug)。

远程调试的工作原理

远程调试的功能在Eclipse、IntelliJ IDEA等大型IDE中均有支持,实现原理都基本相同,这里采用PyCharm进行说明。

在远程调试的模式下,PyCharm(IDE)扮演服务端(Server)的角色,而运行在远程计算机上的应用程序扮演客户端(Client)的角色。正因如此,进行远程调试时,需要先在本地开发环境中设定端口并启动IDE,IDE会对设定的端口开始监听,等待客户端的连接请求;那远程计算机中的应用程序又是怎样与IDE建立通讯连接的呢?

针对远程调试功能,PyCharm提供了pydevd模块,该模块以pycharm-debug.egg的形式存在于PyCharm的安装路径中。远程计算机安装该库文件后,然后就可以调用pydevd.settrace方法,该方法会指定IDE所在机器的IP地址和监听的端口号,用于与IDE建立连接;建立连接后,便可在IDE中对远程在远程计算机中的程序进行单步调试。

使用PyCharm进行远程开发和调试

你是否经常要在Windows 7或MAC OS X上面开发Python或Web应用程序,但是它们最后需要在linux上面来运行呢? 我们经常会碰到开发时没有问题但是到了正式的Linux环境下面却出现问题。那么怎样保证开发环境跟运行环境的一致呢?

通常有两种方法解决。一种是使用PyCharm内置支持的Vagrant,这个教程可以参考Vagrant开发环境配置。 不过很遗憾的是我自己在试验过程中启动VirtualBox虚拟机时候老是报错,暂时还没解决,读者可以自己试着测试看行不行。 第二种方式就是通过PyCharm的远程解释器加上文件同步功能,实现本地编辑代码->同步到服务器->通过远程debug来调试测试程序。目前我选择的是第二种,虽然比第一种更笨拙点。

远程调试的功能在Eclipse、IntelliJ IDEA等大型IDE中均有支持,实现原理都基本相同,这里采用PyCharm进行说明。

远程服务器的同步配置

远程服务器IP地址192.168.203.95,开启ssh服务,安装python版本2.7。我用一个在PyCharm里面的core-python项目来做演示。

首先我们需要配置PyCharm通服务器的代码同步,打开Tools | Deployment | Configuration

点击左边的“+”添加一个部署配置,输入名字,类型选SFTP

python使用PyCharm进行远程开发和调试

确定之后,再配置远程服务器的ip、端口、用户名和密码。root path是文件上传的根目录,注意这个目录必须用户名有权限创建文件。

python使用PyCharm进行远程开发和调试

然后配置映射,local path是你的工程目录,就是需要将本地这个目录同步到服务器上面,我填的是项目根目录。 Deploy path on server 这里填写相对于root path的目录,下面那个web path不用管先

python使用PyCharm进行远程开发和调试

如果你还有一些文件或文件夹不想同步,那么在配置对话框的第三个tab页“Excluded path”里面添加即可,可同时指定本地和远程。

还有一个设置,打开Tools | Deployment | Options,将”Create Empty directories”打上勾,要是指定的文件夹不存在,会自动创建。

上传和下载文件

有几种方法可以实现本地和远程文件的同步,手动和当文件保存后自动触发。这里我选择了手动,因为自动触发比如影响性能,PyCharm会卡,感觉不爽。

手动上传方式很简单,选择需要同步的文件或文件夹,然后选择 Tools | Deployment | Upload to sftp(这个是刚刚配置的部署名称)

python使用PyCharm进行远程开发和调试

下载文件也是一样,选择 Tools | Deployment | Download from sftp

比较远程和本地文件

有时候你并不确定远程和本地版本的完全一致,需要去比较看看。PyCharm提供了对比视图来为你解决这个问题。

选择Tools | Deployment | Browse Remote Host,打开远程文件视图,在右侧窗口就能看到远程主机中的文件

python使用PyCharm进行远程开发和调试

选择一个你想要对比的文件夹,点击右键->Sync with Local,打开同步对比窗口,使用左右箭头来同步内容。

上面是服务器与本地对比,那么本地文件通服务器对比,就先在PyCharm里面选择文件或文件夹,然后右键->Deployment->Sync with deployed to即可

PyCharm远程调试

在PyCharm中进行远程调试有两种选择:

  1. 使用远程的解释器
  2. 使用Python调试服务器

这里简单起见我只演示第一种,使用远程解释器,也就是使用服务器上面安装的python解释器。

配置远程Python解释器

选择File | Settings,选择Project | Project Interpreter,然后在右边,点击那个小齿轮设置,如下

python使用PyCharm进行远程开发和调试

然后点击”Add Remote”,填写主机的ssh配置

python使用PyCharm进行远程开发和调试

如果之前配置过SFTP的话就直接选“Deployment configuration”,然后选择刚刚的模板名称就可以了,由于我上面配置过就直接选模板, 这里请仔细看我的Python解释器是虚拟环境virtualenv,这个要在服务器上面先创建好虚拟环境。

python使用PyCharm进行远程开发和调试

开始调试

完成之后选择这个远程的解释器作为工程的解释器即可,然后配置一个运行实例,打断点调试。 这里我以另外一个django工程为例来说明,名字为zspace,因为用一个web工程来说明更具代表性。

选择“Run/Debug Configuration”,添加一个“Django server”,然后配置像下面这样写

python使用PyCharm进行远程开发和调试

请注意图中标出的几个点,具体什么意思就不用多解释了吧,^_^

然后你就可以像本地调试一样打断点做调试了。这个步骤太简单就不截图了,记得修改源码后同步到服务器继续下一次的调试。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python复制文件代码实现
Dec 23 Python
Python单例模式实例分析
Jan 14 Python
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
使用Python从零开始撸一个区块链
Mar 14 Python
python 删除列表里所有空格项的方法总结
Apr 18 Python
Python实现动态添加属性和方法操作示例
Jul 25 Python
pytorch获取vgg16-feature层输出的例子
Aug 20 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 Python
python神经网络编程实现手写数字识别
May 27 Python
Python生成九宫格图片的示例代码
Apr 14 Python
pytorch查看网络参数显存占用量等操作
May 12 Python
让文件路径提取变得更简单的Python Path库
May 27 Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 #Python
详解Python里使用正则表达式的ASCII模式
Nov 02 #Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 #Python
python中实现精确的浮点数运算详解
Nov 02 #Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
Nov 02 #Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 #Python
Python安装Numpy和matplotlib的方法(推荐)
Nov 02 #Python
You might like
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
PHP运行模式汇总
2016/11/06 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
JS批量操作CSS属性详细解析
2013/12/16 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
详谈javascript中的cookie
2015/06/03 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
js拖拽的原型声明和用法总结
2016/04/04 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
各式各样的导航条效果css3结合jquery代码实现
2016/09/17 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
2016/10/10 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
Python笔记(叁)继续学习
2012/10/24 Python
python实现的各种排序算法代码
2013/03/04 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
python requests证书问题解决
2019/09/05 Python
Python Flask异步发送邮件实现方法解析
2020/08/01 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
学习决心书范文
2014/03/11 职场文书
股权投资意向书
2014/04/01 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
个人委托书范文
2015/01/28 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书