调试在D中运行的python应用程序

2024-05-20 19:22:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近刚开始试着把我的头缠在Docker身上,并设法让一台开发机器投入运行。我现在要做的是能够在我的python应用程序(特别是Django)中的Visual Studio代码中使用调试器。

我试着遵循python extension for VS Code的有限文档,该文档解释了远程调试的参数。

文件

FROM python:3.5.2
RUN apt-get update \
--no-install-recommends && rm -rf /var/lib/apt/lists/* \
&& mkdir -p /code \
EXPOSE 8000
WORKDIR /code
COPY requirements.txt /code
RUN /bin/bash --login -c "pip install -r requirements.txt"
ADD . /code
CMD []

docker compose.yml

version: '2'
services:
    db:
        image: postgres
    web:
        build: .
        volumes:
            - .:/code
        ports:
            - "8000:8000"
        command: bash -c "./wait-for-it.sh db:5432 && python manage.py migrate && python manage.py runserver 0.0.0.0:8000 --noreload"
        depends_on:
            - db

launch.json

{
    "name": "Attach (Remote Debug)",
    "type": "python",
    "request": "attach",
    "localRoot": "${workspaceRoot}",
    "remoteRoot": "/code",
    "port": 8000,
    "secret": "debug_secret",
    "host": "localhost"
}

我还将ptvsd.enable_attach("debug_secret", address = ('0.0.0.0', 8000))行添加到一个项目文件中

问题

当我启动调试器时,什么都没有发生,而且看起来VS代码正在等待一个断点被击中。但从来没有。

有什么想法吗?

编辑:小更新

我尝试过为调试器使用不同的端口,并在docker-compose.yml中公开新端口,但没有成功。似乎附加成功,因为调试器没有崩溃,但没有触发断点。我真的被困在这件事上了。

解决方案

看巴克曼的回答。 我要补充一点,我不能用秘密来让这件事顺利进行。我做了以下工作:

管理.py

import ptvsd
ptvsd.enable_attach(secret=None, address=('0.0.0.0', '3000'))

启动.json

{
        "name": "Attach Vagrant",
        "type": "python",
        "request": "attach",
        "localRoot": "${workspaceRoot}",
        "remoteRoot": "/code",
        "port": 3000,
        "secret": "",
        "host":"localhost"
    }

Tags: install文件run代码文档pyfordb
3条回答

通过将ptvsd代码放入manage.py文件并关闭Django的实时代码重新加载,我对停靠的Django项目进行了最成功的远程调试。

由于Django在您runserver(一个用于实时代码重新加载,另一个用于实际的应用服务器`)时实际上会启动两个服务器,ptvsd似乎真的很困惑它应该监视哪个服务器。我可以通过等待附件、尝试/排除enable_attach方法或闯入调试器来让它工作——但是断点永远不会工作,而且我一次只能调试一个文件。

如果在启动服务器时使用django标志--noreload,则可以在manage.py文件中抛出ptvsd,而不必等待/中断调试器,并享受更加健壮的调试体验。

管理.py:

import ptvsd
ptvsd.enable_attach(secret='mah_secret', address=('0.0.0.0', 3000))

运行服务器:

python manage.py runserver 0.0.0.0:8000 --noreload

希望这有帮助!

我正试图做一些与你非常相似的事情,却遇到了这个问题/评论:

https://github.com/DonJayamanne/pythonVSCode/issues/252#issuecomment-245566383

在这里,它描述了为了使用断点,您需要使用ptvsd.break_into_debugger()函数。

例如:

import ptvsd
ptvsd.enable_attach(secret='my_secret',address = ('0.0.0.0', 3000))
ptvsd.wait_for_attach()
ptvsd.break_into_debugger()

一旦我在python脚本中添加了这个,我的断点就工作了。希望有点用。


2017年1月24日编辑

在我的DockerFile中,我安装了ptvsd:

FROM kaixhin/theano
RUN pip install ptvsd
WORKDIR /src
EXPOSE 3000
ENTRYPOINT ["python","src/app.py"]
COPY . /src

看起来您通过requirements.txt文件安装依赖项,而ptvsd是否在requirements.txt中?

几个解决问题的技巧:

1)确保调试端口已打开。从你的主机运行这个。

nc -zv test.example.com 30302

2)确保您的webserve不会自动重新加载您的应用程序。这将中断调试器连接。在启动时运行的代码中放入print或log语句,以确保应用程序不会被加载两次。这是给socketio在烧瓶上跑步用的。但django和其他web服务器也有类似之处。

socketio.run(app, host="0.0.0.0", port=5000, debug=True, use_reloader=False)

相关问题 更多 >