如何在PyCharm中启动远程调试?
我正在尝试在我的Windows电脑上的PyCharm和运行Django应用的Debian虚拟主机之间进行调试。说明书上说要安装一个包,添加导入语句,然后执行一个命令。我想这些步骤应该在Debian主机上完成,对吧?
那么,我应该把这两行代码放在哪个文件里呢?
from pydev import pydevd
pydevd.settrace('not.local', port=21000, stdoutToServer=True, stderrToServer=True)
我试着把它放进settings.py文件里,但出现了这样的情况……
File "/django/conf/__init__.py", line 87, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/settings.py", line 10, in <module>
pydevd.settrace('dan.local', port=21000, stdoutToServer=True, stderrToServer=True)
File "/pycharm-debug.egg/pydev/pydevd.py", line 1079, in settrace
debugger.connect(host, port)
File "/pycharm-debug.egg/pydev/pydevd.py", line 241, in connect
s = StartClient(host, port)
File "/pycharm-debug.egg/pydev/pydevd_comm.py", line 362, in StartClient
sys.exit(1)
SystemExit: 1
而PyCharm则一直在那儿“等待连接”。
3 个回答
看起来调试器因为某些原因无法通过PyCharm连接到你的Windows主机。你在错误输出中有没有看到其他消息?如果没有的话,可以再试一次,但这次把参数设置为sterrToServer=false。这样可能会显示出它无法连接的真正原因。
这其实只是个小笔记,但里面有些信息可能会帮你节省很多时间。
现在在我的ubuntu和centos 6上,运行
pip install pydevd
是有效的。如果你想真正调试一个在防火墙后面的远程服务器,可以使用以下技巧:
ssh -R 8081:localhost:8081 user@remote-server.com
这样可以让远程代码连接到你机器上监听的
localhost:8081
。如果远程调试器不想启动,提示找不到套接字端口,检查一下你的防火墙规则。要注意,
127.0.0.1
和localhost
不是同一个东西。
PyCharm(或者你选择的其他开发工具)就像是一个“服务器”,而你的应用程序则是“客户端”;所以你需要先启动服务器——告诉IDE进入“调试”模式——然后再运行客户端,也就是包含settrace
语句的代码。当你的Python代码执行到settrace
时,它会连接到服务器(PyCharm),并开始向它发送调试数据。
要实现这个过程,你需要:
1. 将pydev
库复制到远程机器
我需要把文件从C:\Program Files\JetBrains\PyCharm 1.5.3\pycharm-debug.egg
复制到我的Linux机器上。我把它放在了/home/john/api-dependancies/pycharm-debug.egg
。
2. 将这个文件放入PYTHONPATH中
希望你明白,除非Python能找到这个文件,否则你是无法使用它的。我想大多数人会用easy_install,但在我的情况下,我是通过手动添加来实现的,具体是:
import sys
sys.path.append('/home/john/app-dependancies/pycharm-debug.egg')
这样做只是因为我还没有成功安装这个文件。这是我的变通办法。
3. 设置调试服务器配置
在PyCharm中,你可以通过以下步骤配置调试服务器:
- 运行 -> 编辑配置:打开“运行/调试配置”对话框
- 默认 -> “Python远程调试”:这是要使用的模板
- 填写本地主机名和端口,可能还想要“使用路径映射”,但下面会详细讲到这些...
点击“确定”
本地主机名:指的是服务器的名字——在我的例子中是Windows主机,实际上是Windows主机的IP地址,因为我的远程机器不知道主机名。所以虚拟(远程)机器必须能够访问主机。可以使用
ping
和netstat
来检查。端口:可以选择任何空闲的非特权端口,比如
21000
,这个端口不太可能被占用。现在先不用担心路径映射。
4. 启动调试服务器
- 运行 -> 调试:启动调试服务器——选择你刚创建的配置。
调试控制台标签会出现,你应该在控制台看到
Starting debug server at port 21000
这意味着IDE调试服务器正在等待你的代码与它建立连接。
5. 插入代码
这段代码可以在单元测试中使用:
from django.test import TestCase
class APITestCase(TestCase):
def test_remote_debug(self):
import sys
sys.path.append('/home/john/dependancies/pycharm-debug.egg')
from pydev import pydevd
pydevd.settrace('192.168.33.1', port=21000, suspend=False)
print "foo"
在Django网页应用中,放置的位置有点讲究——似乎只有在其他所有操作完成后才有效:
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
sys.path.append('/vagrant/pycharm-debug.egg')
import pydevd
pydevd.settrace('192.168.33.1', port=21000, suspend=False)
再次强调,IP地址是你运行PyCharm的机器;你应该能够从运行代码/网站的机器上ping这个IP地址。端口可以自己选择,只要确保PyCharm监听的是同一个端口。我发现suspend=False
比默认设置更好,因为默认设置会立即暂停,让你不确定是否有效,同时还试图将数据流向stdin/out,这可能会给你带来麻烦。
6. 打开防火墙
Windows 7的防火墙默认会阻止你的入站连接。使用netstat命令在远程主机上,你会发现SYN_SENT状态永远不会变为ESTABLISHED,至少在你为“pycharm”这个应用程序添加防火墙例外之前是这样的。
OS/X和Ubuntu默认没有防火墙(可能有人后来添加了)。
7. 设置断点并运行代码
经过这些步骤后,如果一切顺利,你可以设置一个断点——在settrace
执行之后的某个地方——然后PyCharm控制台会显示
Connected to pydev debugger (build 107.386)
在“调试器”标签下,变量堆栈将开始工作,你可以逐步执行代码。
8. 路径映射
路径映射告诉PyCharm在哪里可以找到源代码。所以当调试器说“我正在运行文件/foo/bar/nang.py的第393行”时,PyCharm可以将这个远程绝对路径转换为本地绝对路径...并显示源代码。
/Users/john/code/app/ /opt/bestprice/app/
/Users/john/code/master/lib /opt/bestprice/lib/python2.7/site-packages
完成。