【问题标题】:Django / Docker / Remote Debug using PydevDjango / Docker / 使用 Pydev 进行远程调试
【发布时间】:2016-07-03 16:42:45
【问题描述】:

我的设置如下: - 在 docker 中运行的 django 服务器,端口映射:8090:8090 - 带有 PyDev 的 Eclipse

我希望能够在 Pydev 上放断点(点击一行,一步一步)

我发现了几篇类似的文章; http://www.pydev.org/manual_adv_remote_debugger.html

但它仍然无法正常工作。

1) 我应该将 manage.py 更新为 "import pydev" 吗?要添加哪些行,我必须在 docker 容器内复制 pydev 插件的 pysrc 才能进行模块导入?

2) 是否需要端口转发?运行到 docker 中的 python 实例应该可以访问主机上的远程调试服务器?

3) 我找到了关于 pycharm 和使用 ssh 进行远程调试的文章?不能用 pydev 做类似的事情吗?

4) 如何“链接”我的本地目录和 docker “目录”?

[编辑] 我找到了解决方案

  • 将 eclipse/path_to\pydev\plugins\org.python.pydev\pysrc 目录复制到 docker 容器可以访问的地方。

  • 编辑 pysrc/pydevd_file_utils.py,并在主机和 docker 容器之间添加目录映射,例如: PATHS_FROM_ECLIPSE_TO_PYTHON = [(r'C:/django',r'/.../lib/django'), (r'C:/workspace/myapp',r'/var/www/myapp')] 如果您有多个包含 python 代码的路径,则可以设置多个元组

  • 编辑 manage.py 并添加以下内容

    sys.path.append('/my_path/to_pysrc_/under_docker/pysrc') 导入 pydevd pydevd.settrace(host='172.17.42.1')​​ #你主机的IP

  • 在 Pydev 中,在首选项 > Pydev > 运行/调试 > 远程调试器端口:5678

  • 在Debug Perspective中,点击“Start the Pydev server”

  • 在你的 docker 中,运行:python manage.py runserver 0.0.0.0:8090 --noreload

    (将 8090 替换为您的 http 端口)

    • 在 Pydev 中:你会看到代码在 settrace 之后就中断了!

    • 现在您可以添加一些断点并使用 Pydev 的调试 CLI :) 享受吧!

【问题讨论】:

  • 其实你可以跳过一些步骤...我会在不久的将来发布一个简化的答案。无论如何,感谢您的问题/回答对您有很大帮助!

标签: django docker debugging pydev remote-debugging


【解决方案1】:

我遇到了类似的问题 - docker 中的 django 项目,通过 docker 解释器通过 pycharm 145.1504 和 162.1120 连接到 docker,运行服务器工作正常,但在 pycharm 运行后调试是堆栈

/usr/bin/python2.7 -u /root/.pycharm_helpers/pydev/pydevd.py --multiproc --qt-support --client '0.0.0.0' --port 38324 --file /opt/项目/manage.py 运行服务器 0.0.0.0:8000.

我试图找出原因几天,然后通过 ssh 连接将 pycharm 连接到 docker,一切正常,运行和调试。

【讨论】:

    【解决方案2】:

    好的,根据你写的内容,我假设你在本地机器上运行了一个 Django docker 容器。

    1. 从容器内部(例如,docker-compose exec <container name> bash 进入容器)
      pip install pydevd

    2. 在 Eclipse 中,设置如下断点:
      import pydevd; pydevd.settrace('docker.for.mac.localhost')

      如果您不使用 Docker for Mac,则必须做一些工作才能从容器内部获取机器的 IP,例如见this

    3. 进入 Debug Perspective 并启动 PyDev 调试服务器

    4. 启动您的应用程序或测试

    ...当代码在断点处停止时,您应该会看到堆栈、变量等的视图。

    在 Python 3.7 中,现在有一个内置断点,您可以将其配置为使用环境变量指向您最喜欢的调试器(默认为 pdb):

    breakpoint()
    

    它也需要参数,所以你可以这样做:

    breakpoint(host='docker.for.mac.localhost')
    

    我发现打字有点烦人,所以我最终在一个应用程序中放入了一个如下所示的模块:

    # my_app/pydevd.py
    
    import pydevd
    
    def set_trace():
        pydevd.settrace('docker.for.mac.localhost')
    

    然后我为内置断点设置环境变量(比如在您的docker-compose.yml 中):

    PYTHONBREAKPOINT=my_app.pydevd.set_trace

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-03
      • 2018-08-19
      • 2019-11-19
      • 2016-04-06
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      相关资源
      最近更新 更多