使用Pydev进行Django / Docker /远程调试

时间:2016-03-17 11:07:23

标签: django docker debugging pydev remote-debugging

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

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

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

但它仍无法正常工作。

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

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

3)我发现有关使用ssh的pycharm和远程调试的文章?不可能与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:/工作区/ MyApp的',R' /无功/网络/ MyApp的&#39)] 如果你有几个包含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中,单击"启动Pydev服务器"

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

    (用你的http端口替换8090)

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

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

2 个答案:

答案 0 :(得分:1)

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

  

/usr/bin/python2.7 -u /root/.pycharm_helpers/pydev/pydevd.py --multiproc --qt-support --client' 0.0.0.0' --port 38324 --file /opt/project/manage.py runserver 0.0.0.0:8000。

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

答案 1 :(得分:0)

好吧,根据您所写的内容,我将假定您有一个在本地计算机上运行的Django Docker容器。

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

  2. 在Eclipse中,放置一个这样的断点:
    import pydevd; pydevd.settrace('docker.for.mac.localhost')

    如果您不使用Mac的Docker,则必须做一些工作才能从容器内部获取计算机的IP,例如参见https://github.com/gruby-murzyn/agency/tree/master/majeni

  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