【问题标题】:How do I start up remote debugging with PyCharm?如何使用 PyCharm 启动远程调试?
【发布时间】:2011-10-22 19:53:49
【问题描述】:

我正在尝试在 PyCharm(在 Windows 主机上)和运行我的 django 应用程序的 debian 虚拟主机之间进行调试。说明说安装 egg,添加导入,然后调用命令。我认为这些事情需要在 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 只是坐在那里“等待连接”

【问题讨论】:

    标签: python django remote-debugging pycharm


    【解决方案1】:

    PyCharm(或您选择的 IDE)充当“服务器”,您的应用程序是“客户端”;所以你首先启动服务器——告诉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 可以找到它,否则您将无法使用 egg。我猜大多数人都使用easy_install,但在我的例子中,我明确地添加了它:

       import sys
       sys.path.append('/home/john/app-dependancies/pycharm-debug.egg')
    

    这只是必要的,因为我仍然没有成功安装鸡蛋。这是我的解决方法。

    3.设置调试服务器配置

    在 PyCharm 中,您可以通过以下方式配置调试服务器:

    • 运行-> 编辑配置:打开“运行/调试配置”对话框
    • 默认值 -> “Python Remote Debug”:是要使用的模板
    • 填写本地主机名和端口,您可能想要“使用路径映射”,但更多内容请参见下文...
    • “好的”

      本地主机名:表示服务器的名称——在我的例子中是windows主机——或者实际上是windows主机的IP地址,因为主机名我的远程机器不知道。所以虚拟(远程)机器必须能够到达主机。 pingnetstat 很适合这个。

      端口:可以是您喜欢的任何空闲的非特权端口。例如:21000 不太可能被使用。

      暂时不用担心路径映射。

    4.启动调试服务器

    • 运行-> Debug : 启动调试服务器 - 选择刚刚创建的配置。

    调试控制台选项卡将出现,你应该得到

     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 web 应用程序中,放置它的位置有点挑剔 - 似乎只有在完成其他所有操作后才能工作:

    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 的问题比默认设置要小,不仅会立即停止,因此您不确定它是否正常工作,而且还会尝试流式传输到标准输入/输出,这也可能让您感到悲伤。

    6.打开防火墙

    默认情况下,Windows 7 防火墙会阻止您的传入连接。在远程主机上使用 netstat,您将能够看到 SYN_SENT 永远不会成为 ESTABLISHED,至少在您为应用程序 'pycharm' 添加一个例外到 Windows 防火墙之前是这样。

    OS/X 和 Ubuntu 没有防火墙可打(默认情况下,有人可能会稍后应用)。

    7.设置断点并运行代码

    毕竟,当一切按计划进行时,您可以设置一个断点 - 在 settrace 运行后的某个地方 - pycharm 控制台将显示

    Connected to pydev debugger (build 107.386)
    

    在“调试器”选项卡下,变量堆栈将开始工作,您可以单步执行代码。

    8.映射

    Mapping 告诉 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
    

    完成。

    【讨论】:

    • 这是一篇精彩的文章,谢谢!我不知道自这篇文章以来是否在较新版本的 PyCharm 中修复了某些问题,但我能够将 settrace 行直接放在 Django 视图中,一旦命中该行,浏览器就会暂停并且我已成功调试。
    • 非常感谢您的逐步解释。我可以补充一下: - 调试 Web 应用程序可能最好通过在要调试的视图中添加 bp 或在您正在使用的处理程序类的 get_response() 中添加,如果您想尽早介入。 - 一旦遇到断点,可以即时添加路径映射。如果 PyCharm 还没有提供映射,它会要求提供映射,甚至会做出有根据的自动建议。
    • 我发现 pydev 调用的最佳位置是在 manage.py 中,这样您就可以使用断点调试 Django 项目的任何部分。
    • 在 PyCharm 2.7 中,要包含在远程 Python 脚本中的代码稍作更改以使用:import pydevd
    • 这是一个很大的帮助,但我有一个防火墙阻止了端口 21000 来应对。我找到的解决方案是从运行 PyCharm 的盒子到远程服务器打开一个反向隧道 ssh 会话。我通过将“-R 21000:localhost:21000”插入到远程机器的 ssh 连接中来做到这一点(您可以添加 -v 来调试 ssh)。然后我打开另一个 ssh 到远程机器来启动我想要调试的脚本,然后连接回我的 PyCharm 并允许调试代码。脚本输出出现在第二个 ssh 会话中。
    【解决方案2】:

    实际上,它只是一个注释,但包含一些可以节省时间的信息。

    1. 现在 pip install pydevd 在 ubuntu 和 centos 6 上为我工作

    2. 如果你想真正调试位于防火墙和其他东西后面的远程服务器,你可以使用以下技巧:

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

      这允许远程代码连接到你的机器上监听localhost:8081

    3. 如果远程调试器不想启动,说它找不到套接字端口,请检查您的防火墙规则。请注意,127.0.0.1 的规则与 localhost 的规则不同。

    【讨论】:

    • 哇,这非常有帮助:)
    【解决方案3】:

    由于某种原因,调试器似乎无法使用 PyCharm 连接到您的 Windows 主机。您在 stderr 中没有收到任何其他消息吗?如果还没有,请尝试再运行一次,但使用 sterrToServer=false。这可能表明它无法连接的真正原因。

    【讨论】:

    • 对不起,没有任何区别。我看不到其他消息。你能告诉我 pycharm 是客户端,我的应用程序是服务器,反之亦然吗?
    • 这有帮助。更近一步:我在 settrace 中命名了错误的主机。我可以看到它现在建立了连接(netstat)。不幸的是还没有派对......没有settrace行,将它们保存到views.py页面中,重新启动网络服务器,在pycharm中开始“调试”,现在尝试重新加载页面但响应从未完成,它就在那里旋转而 pycharm 什么也没说 - 没有“播放”或“步骤”等亮起。貌似执行被暂停了但是pycharm不知道?
    • 哦。等待。我现在让它在单元测试中工作。耶!只是要运行的网络服务器。
    • 我尝试按照这些说明使用 PyCharm(localhost) 远程调试在 virtualbox vm 上运行的 django 应用程序。在 PyCharm 中开始调试(“等待连接......”)之后,当我在远程 vm 上启动 django 应用程序时,我从未遇到任何断点。我在 manage.py 中有 pydev.settrace()。 PyCharm 调试窗口仍然显示“Waiting to connect....”。知道我可能做错了什么吗?
    • 有谁知道如何解决 Django 的“等待连接...”问题。我在 ubuntu 主机上运行了类似的 PyCharm (ver:3.4) 配置/设置,以及在 docker 容器中远程运行的 Django 应用程序。
    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2019-02-05
    • 1970-01-01
    • 2016-06-15
    • 2017-01-10
    • 2012-08-25
    相关资源
    最近更新 更多