公司要用Python开发一个基于Linux的系统,我是不可能忍受把我的“高端Mac”换成矮挫丑的Linux的(更何况还要考虑团队中有很多同事用Windows)。借助PyCharm的远程调试可以实现“本地写代码,远程Debug”
配置PyCharm远程调试
选择Project Interpreter的时候我们是可以选择“Add Remote”
打开之后是一片“新大陆”
我们先通过SSH配置,输入服务器的地址,账号密码,勾选服务器端的Python路径。确定之后PyCharm会把在远程机器上安装Python Helpers(默认安装在Home目录下的.pycharm_helpers,比如我用的是fireflyc所以目录是/home/fireflyc/.pycharm_helpers)。
这里最关键的一个步骤——Path Maping。它是本地路径和服务器路径的映射关系,当我们在本地执行Debug的时候代码其实是在远程Linux上执行的,这必须解决一个问题——如何把代码同步到远程Linux上。最简单的办法是通过VMware装一个虚拟机,用"文件共享"的方式。
设置完成后需要在Path Maping中新增映射关系
LocalPath是工程的根目录,Remote Path是共享文件夹所在目录
执行一下,“如丝般顺滑”,还能打断点。
远程调试的原理
远程调试不是什么黑魔法,它是IDE工具发展的一种倾向——细分前端和后端。前端偏向于完成代码编辑、呈现工作相当于设置一个框架;后端则是针对某个语言的语法加亮、代码提示、自动完成、代码格式化、调试。比如visual code在这一点上表现的就非常明显,VSC只提供了一个“编辑器”的功能,每个语言的加亮、代码提示、格式化、调试都是通过“插件”实现的。这个插件不是传统意义上的“静态”的,而是一个独立的进程。visual code称这个为language server,并且制定了一个Language Server Protocol的规范。有兴趣的朋友可以去看一下或者尝试自己写一个插件。
PyCharm还没有这么彻底,它只是把Debug部分做成一个单独的Server。去看一下“神秘”的.pycharm_helpers就一目了然了
PyCharm远程调试的时候我们偷偷的看一下进程
真相大白了。原理其实很简单,调试的时候PyCharm通过SSH执行远程Linux上的pydev,这个进程会执行本地的python代码。pydev和Pycharm会有网络通讯用来传递“打断点、取消断点、单步执行”之类的调试动作,端口是——45140。
自动化开发环境
解决了远程调试的问题后顺带可以解决一下“开发环境”的问题;每个人都去新建一台虚拟机会比较麻烦,***可能选择的发行版本千奇百怪。所以通过vagrant来管理“开发虚拟机”是一种很好的实践。
这段脚本会生成一个ubuntu/trusty64镜像的虚拟机(ubuntu 14),使用的是virtualbox;把虚拟机的8000端口映射成本机的8000端口;设置共享目录(我的Vagrantfile在工程根目录下的dev文件夹,所以../其实就是工程根目录);设置虚拟机***次启动的时候执行的脚本(会设置软件的源,关闭防火墙之类的)
通过上面的配置整个开发环境就自动化了,开发人员拿到代码之后执行切换到dev目录下执行vagrant up,然后选择
PathMapping系统会为我们自动添加上(根据vagrantfile的配置)
Vagrant小结
Vagrant是一个定义虚拟机的配置工具,你可以用一段Ruby脚本设置自己虚拟机的大小、配置、使用的虚拟化软件,之后执行vagrant up就会自动创建出一台虚拟机。
Vagrant会自动生成一个vagrant的用户同时生成一对SSH密钥,私钥会放在.vagrant文件夹下(执行vagrant up后会看到有一个.vagrant文件夹的)。我们执行vagrant ssh xxx的时候会自动使用这个私钥登录。所以PyCharm的配置其实还是通过SSH,原理并没有变。
关于Docker
PyCharm还支持Docker,但是我觉得这个并没有什么用。在MacOS、Windows上Docker其实是先启动一台虚拟机里面装上Linux然后在里面装Docker。
总结
远程调试其实只有两个要点,pydev帮我们解决了远程断点、启动的问题;我们自己要解决代码同步的问题。文章都是用虚拟机来做开发环境的,你也可以用一台公用的机器来做开发环境。这种情况下你就必须用下面的方式开启文件同步了。
***补充一点,我推荐用vagrant的方式它可以帮我们“规范化虚拟机”;如果你开发的程序必须用root启动(vagrant是用vagrant用户启动的)那么只能用ssh了。(我们也可以只让vagrant帮我们生成虚拟机,我们自己进去修改root的密码,然后通过ssh连接进去。)
【本文是51CTO专栏作者邢森的原创文章,转载请联系作者本人获取授权】