原文鏈接:利用PyCharm進行Python遠程調試
背景描述
有時候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中對遠程在遠程計算機中的程序進行單步調試。
遠程調試的配置方法
1、在遠程計算機上安裝pydevd
模塊
首先,在本地開發環境的PyCharm安裝路徑中找到pycharm-debug.egg
文件(若遠程計算機運行的是Python3,則需要pycharm-debug-py3k.egg
);
然后,將pycharm-debug.egg
文件拷貝至遠程計算機,在遠程計算機中將pycharm-debug.egg
添加至引用路徑,可以采用多種方式:
- 采用
easy_install pycharm-debug.egg
命令進行安裝(pip命令無法安裝,只能使用easy_install) - 將
pycharm-debug.egg
添加至PYTHONPATH
或sys.path
:import sys; sys.path.append('/home/leo/app-dependancies/pycharm-debug.egg')
- 解壓
pycharm-debug.egg
,將其中的pydev
文件夾拷貝至遠程應用程序目錄下
最后,在遠程計算機的Python命令行中輸入import pydevd
,若沒有報錯則說明pydevd
模塊安裝成功。
2、在本地開發環境的PyCharm中進行監聽配置
在PyCharm中配置說明如下:
- 【Run】->【Edit Configurations】
- 【Add New Configuration】->【Python Remote Debug】
- 填寫
Local host name
和Port
,其中Local host name
指的是本機開發環境的IP地址,而Port
則隨便填寫一個10000以上的即可;需要注意的是,由於遠程計算機需要連接至本地開發環境,因此本地IP地址應該保證遠程可以訪問得到 - 【Apply】and【OK】
3、在本地開發環境的PyCharm中配置Mapping映射
4、在遠程計算機的應用程序中插入代碼
將如下代碼插入至遠程計算機的應用程序中。
import pydevd pydevd.settrace('100.84.48.156', port=31235, stdoutToServer=True, stderrToServer=True)
其中,IP地址和端口號要與PyCharm中的監聽配置保持一致。
5、在PyCharm中啟動Debug Server
【Run】->【Debug…】,選擇剛創建的遠程調試配置項,在Debug Console
中會顯示如下信息:
Starting debug server at port 31235
Waiting for process connection... Use the following code to connect to the debugger: import pydevd pydevd.settrace('100.84.48.156', port=31235, stdoutToServer=True, stderrToServer=True)
這說明Debug Server
已經啟動並處於監聽狀態。
6、在遠程計算機中啟動應用程序
在遠程計算機中啟動應用程序,當執行到pydevd.settrace
語句時,便會與本地開發環境中的PyCharm建立通訊連接,接下來便可以在本地IDE中進行單步調試了。
需要注意的是,本地開發環境必須保證IP地址和端口號可從遠程計算機訪問得到,否則會無法建立連接。
$ telnet 100.84.48.156 31235 Trying 100.84.48.156... telnet: Unable to connect to remote host: Connection refused $ python devicedectector.py Could not connect to 100.84.48.156: 31236 Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/pycharm-debug.egg/pydevd_comm.py", line 478, in StartClient s.connect((host, port)) File "/usr/lib/python2.7/socket.py", line 224, in meth return getattr(self._sock,name)(*args) error: [Errno 111] Connection refused