PyCharm 远程调试

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