飛翔的靈蛇——PyCharm遠(yuǎn)程調(diào)試
公司要用Python開發(fā)一個(gè)基于Linux的系統(tǒng),我是不可能忍受把我的“高端Mac”換成矮挫丑的Linux的(更何況還要考慮團(tuán)隊(duì)中有很多同事用Windows)。借助PyCharm的遠(yuǎn)程調(diào)試可以實(shí)現(xiàn)“本地寫代碼,遠(yuǎn)程Debug”
配置PyCharm遠(yuǎn)程調(diào)試
選擇Project Interpreter的時(shí)候我們是可以選擇“Add Remote”
打開之后是一片“新大陸”
我們先通過SSH配置,輸入服務(wù)器的地址,賬號密碼,勾選服務(wù)器端的Python路徑。確定之后PyCharm會(huì)把在遠(yuǎn)程機(jī)器上安裝Python Helpers(默認(rèn)安裝在Home目錄下的.pycharm_helpers,比如我用的是fireflyc所以目錄是/home/fireflyc/.pycharm_helpers)。
這里最關(guān)鍵的一個(gè)步驟——Path Maping。它是本地路徑和服務(wù)器路徑的映射關(guān)系,當(dāng)我們在本地執(zhí)行Debug的時(shí)候代碼其實(shí)是在遠(yuǎn)程Linux上執(zhí)行的,這必須解決一個(gè)問題——如何把代碼同步到遠(yuǎn)程Linux上。最簡單的辦法是通過VMware裝一個(gè)虛擬機(jī),用"文件共享"的方式。
設(shè)置完成后需要在Path Maping中新增映射關(guān)系
LocalPath是工程的根目錄,Remote Path是共享文件夾所在目錄
執(zhí)行一下,“如絲般順滑”,還能打斷點(diǎn)。
遠(yuǎn)程調(diào)試的原理
遠(yuǎn)程調(diào)試不是什么黑魔法,它是IDE工具發(fā)展的一種傾向——細(xì)分前端和后端。前端偏向于完成代碼編輯、呈現(xiàn)工作相當(dāng)于設(shè)置一個(gè)框架;后端則是針對某個(gè)語言的語法加亮、代碼提示、自動(dòng)完成、代碼格式化、調(diào)試。比如visual code在這一點(diǎn)上表現(xiàn)的就非常明顯,VSC只提供了一個(gè)“編輯器”的功能,每個(gè)語言的加亮、代碼提示、格式化、調(diào)試都是通過“插件”實(shí)現(xiàn)的。這個(gè)插件不是傳統(tǒng)意義上的“靜態(tài)”的,而是一個(gè)獨(dú)立的進(jìn)程。visual code稱這個(gè)為language server,并且制定了一個(gè)Language Server Protocol的規(guī)范。有興趣的朋友可以去看一下或者嘗試自己寫一個(gè)插件。
PyCharm還沒有這么徹底,它只是把Debug部分做成一個(gè)單獨(dú)的Server。去看一下“神秘”的.pycharm_helpers就一目了然了
PyCharm遠(yuǎn)程調(diào)試的時(shí)候我們偷偷的看一下進(jìn)程
真相大白了。原理其實(shí)很簡單,調(diào)試的時(shí)候PyCharm通過SSH執(zhí)行遠(yuǎn)程Linux上的pydev,這個(gè)進(jìn)程會(huì)執(zhí)行本地的python代碼。pydev和Pycharm會(huì)有網(wǎng)絡(luò)通訊用來傳遞“打斷點(diǎn)、取消斷點(diǎn)、單步執(zhí)行”之類的調(diào)試動(dòng)作,端口是——45140。
自動(dòng)化開發(fā)環(huán)境
解決了遠(yuǎn)程調(diào)試的問題后順帶可以解決一下“開發(fā)環(huán)境”的問題;每個(gè)人都去新建一臺(tái)虛擬機(jī)會(huì)比較麻煩,***可能選擇的發(fā)行版本千奇百怪。所以通過vagrant來管理“開發(fā)虛擬機(jī)”是一種很好的實(shí)踐。
這段腳本會(huì)生成一個(gè)ubuntu/trusty64鏡像的虛擬機(jī)(ubuntu 14),使用的是virtualbox;把虛擬機(jī)的8000端口映射成本機(jī)的8000端口;設(shè)置共享目錄(我的Vagrantfile在工程根目錄下的dev文件夾,所以../其實(shí)就是工程根目錄);設(shè)置虛擬機(jī)***次啟動(dòng)的時(shí)候執(zhí)行的腳本(會(huì)設(shè)置軟件的源,關(guān)閉防火墻之類的)
通過上面的配置整個(gè)開發(fā)環(huán)境就自動(dòng)化了,開發(fā)人員拿到代碼之后執(zhí)行切換到dev目錄下執(zhí)行vagrant up,然后選擇
PathMapping系統(tǒng)會(huì)為我們自動(dòng)添加上(根據(jù)vagrantfile的配置)
Vagrant小結(jié)
Vagrant是一個(gè)定義虛擬機(jī)的配置工具,你可以用一段Ruby腳本設(shè)置自己虛擬機(jī)的大小、配置、使用的虛擬化軟件,之后執(zhí)行vagrant up就會(huì)自動(dòng)創(chuàng)建出一臺(tái)虛擬機(jī)。
Vagrant會(huì)自動(dòng)生成一個(gè)vagrant的用戶同時(shí)生成一對SSH密鑰,私鑰會(huì)放在.vagrant文件夾下(執(zhí)行vagrant up后會(huì)看到有一個(gè).vagrant文件夾的)。我們執(zhí)行vagrant ssh xxx的時(shí)候會(huì)自動(dòng)使用這個(gè)私鑰登錄。所以PyCharm的配置其實(shí)還是通過SSH,原理并沒有變。
關(guān)于Docker
PyCharm還支持Docker,但是我覺得這個(gè)并沒有什么用。在MacOS、Windows上Docker其實(shí)是先啟動(dòng)一臺(tái)虛擬機(jī)里面裝上Linux然后在里面裝Docker。
總結(jié)
遠(yuǎn)程調(diào)試其實(shí)只有兩個(gè)要點(diǎn),pydev幫我們解決了遠(yuǎn)程斷點(diǎn)、啟動(dòng)的問題;我們自己要解決代碼同步的問題。文章都是用虛擬機(jī)來做開發(fā)環(huán)境的,你也可以用一臺(tái)公用的機(jī)器來做開發(fā)環(huán)境。這種情況下你就必須用下面的方式開啟文件同步了。
***補(bǔ)充一點(diǎn),我推薦用vagrant的方式它可以幫我們“規(guī)范化虛擬機(jī)”;如果你開發(fā)的程序必須用root啟動(dòng)(vagrant是用vagrant用戶啟動(dòng)的)那么只能用ssh了。(我們也可以只讓vagrant幫我們生成虛擬機(jī),我們自己進(jìn)去修改root的密碼,然后通過ssh連接進(jìn)去。)
【本文是51CTO專欄作者邢森的原創(chuàng)文章,轉(zhuǎn)載請聯(lián)系作者本人獲取授權(quán)】