要求: 通过 SSH 从本地机器访问远程服务器,使用任何预定义的端口从远程服务器访问本地机器,最好关掉等网络代理服务。
单独在远程执行:
python -u /root/.pycharm_helpers/pydev/pydevd.py --multiproc --client 0.0.0. 0 --port 37990
报错:
Could not connect to 0.0.0.0: 37990
Traceback (most recent call last):
File "/root/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_comm.py", line 456, in start_client
s.connect((host, port))
ConnectionRefusedError: [Errno 111] Connection refused
Traceback (most recent call last):
File "/root/.pycharm_helpers/pydev/pydevd.py", line 2173, in
main()
File "/root/.pycharm_helpers/pydev/pydevd.py", line 2055, in main
dispatcher.connect(host, port)
File "/root/.pycharm_helpers/pydev/pydevd.py", line 1826, in connect
self.client = start_client(self.host, self.port)
File "/root/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_comm.py", line 456, in start_client
s.connect((host, port))
ConnectionRefusedError: [Errno 111] Connection refused
问题原因分析:
要求: 通过 SSH 从本地机器访问远程服务器,使用任何预定义的端口从远程服务器访问本地机器。
从主菜单中选择 Run | Edit Configuration… 。运行/调试配置对话框打开。您必须单击工具栏,然后从可用配置列表中选择 pythondebug Server。
输入运行/调试配置的名称,设为 MyRemoteServer;指定运行 IDE 的机器的端口号(这里是12345)和 IDE 主机名(这里是172.20.208.95);远程调试服务器将使用这些参数来访问它。
根据IDE界面的提醒,安装对应的pydevd-charm;执行 pydevd_pycharm.settrace
将本地机器上的路径映射到远程机器上的路径:
使用步骤:
1. IDE 启动后,会显示自己在监听状态,然后在Pycharm中设置断点。
2. 然后运行远端的py程序,使用命令行执行(并非在IDE中,是在远端命令执行)
修改源代码文件如下:
import math
#==============this code added==================================================================:
import pydevd_pycharm
pydevd_pycharm.settrace('172.20.208.95', port=12345, stdoutToServer=True,
stderrToServer=True)
#================================================================================================
class Solver:
def demo(self, a, b, c):
d = b ** 2 - 4 * a * c
if d > 0:
disc = math.sqrt(d)
root1 = (-b + disc) / (2 * a)
root2 = (-b - disc) / (2 * a)
return root1, root2
elif d == 0:
return -b / (2 * a)
else:
return "This equation has no roots"
if __name__ == '__main__':
solver = Solver()
while True:
a = int(input("a: "))
b = int(input("b: "))
c = int(input("c: "))
result = solver.demo(a, b, c)
print(result)
如上,可以看到该方法对代码有侵入!
注意事项: 如果将程序部署到远端,那么需要Remote Debug配置中的localhost修改为安装Pycharm主机的IP地址,同时将PycharmRemoteDebug.py中的localhost改为同样的IP地址。
使用Pycharm的Deployment功能映射远程和本地代码;
断点命中时,客户端程序处于暂定状态;
如果没有开启Remote Debug Server,运行客户端会卡住;
不需要使用Remote Debug时一定不要在程序启动的时候import PycharmRemoteDebug模块;
总结: 因此,此方案,必须保证远端环境可以主动连接到你IDE本地环境!
如果程序部署在远端,要在本地获取程序运行状态并进行断点调试,必然需要连接到程序并进行通讯;利用Pycharm进行远程调试的过程中,Pycharm充当服务器的角色。
首先,对Pycharm Run/Debug Configures进行配置,指定Pycharm安装端的一些属性,比如Pycharm所在主机的IP地址和端口号等。
然后,启动Pycharm的远程调试。这时Pycharm处于监听状态,等待独立于IDE之外运行的程序的连接。
其次,在远端程序刚启动时,需要根据Pycharm Debug Configures中的配置信息,连接到Pycharm。
最后,连接成功之后,当远程客户端运行到本地Pycharm中设置的断点处时,便会在断点处暂停程序的执行,而在本地Pycharm命中断点处能够看到远端程序当前运行的状态和调用栈等信息并进行下一步跟踪和逐步调试。
本地Pycharm中调试的源代码工程应和远端运行的程序源代码保持一致。
Pycharm中Remote Debug Configure的配置要保证能够被远程连接。
由于远程客户端使用Pycharm提供的pydevd模块连接到本地的Pycharm remote Debug,两者通讯链接均遵循Pycharm自定义的协议;因此我们不必关心Pycharm设置断点和远程客户端命中断点过程中两端具体的实现和处理过程,只要保证我们的Debug Configure有效即可;然后在需要的地方通过断点暂定程序,分析当前程序状态找出问题所在。