如何在PyCharm中启动远程调试?

57 投票
3 回答
55476 浏览
提问于 2025-04-16 23:10

我正在尝试在我的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 个回答

1

看起来调试器因为某些原因无法通过PyCharm连接到你的Windows主机。你在错误输出中有没有看到其他消息?如果没有的话,可以再试一次,但这次把参数设置为sterrToServer=false。这样可能会显示出它无法连接的真正原因。

12

这其实只是个小笔记,但里面有些信息可能会帮你节省很多时间。

  1. 现在在我的ubuntu和centos 6上,运行 pip install pydevd 是有效的。

  2. 如果你想真正调试一个在防火墙后面的远程服务器,可以使用以下技巧:

    ssh -R  8081:localhost:8081 user@remote-server.com
    

    这样可以让远程代码连接到你机器上监听的 localhost:8081

  3. 如果远程调试器不想启动,提示找不到套接字端口,检查一下你的防火墙规则。要注意,127.0.0.1localhost 不是同一个东西。

121

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地址,因为我的远程机器不知道主机名。所以虚拟(远程)机器必须能够访问主机。可以使用pingnetstat来检查。

    端口:可以选择任何空闲的非特权端口,比如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

完成。

撰写回答