Visual Studio代码 - 如何在Docker容器中远程调试python代码

12 python remote-debugging docker visual-studio-code

我想在VSC中远程配音python:

它是main.py文件:

print('Hello, World')
Run Code Online (Sandbox Code Playgroud)

debug.py:

import ptvsd
ptvsd.enable_attach('my_secret', address=('0.0.0.0', 7102))
ptvsd.wait_for_attach()
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM python:3.6-slim

EXPOSE 7102

RUN pip install ptvsd

WORKDIR /app

COPY . .

CMD ["python", "debug.py"]
Run Code Online (Sandbox Code Playgroud)

它是launch.json文件:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach (Remote Debug)",
            "type": "python",
            "request": "attach",
            "localRoot": "${workspaceRoot}",
            "remoteRoot": "/app",
            "port": 7102,
            "secret": "my_secret",
            "host": "172.17.0.3"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是一个构建和启动容器的命令:

docker build -t python-for-debug.

docker run -it -p 7102:7102 python-for-debug

当我运行调试器时,我得到: vs代码屏幕

调试控制台没有任何错误,没有输出,没有问题.没有任何输出用于运行容器.没有泊坞日志

VS Code版本:1.15.0 Docker版本17.06.0-ce,build 02c1d87

小智 5

嗨,您应该使用ptvsd 3,因此将Dockerfile中的RUN行更改为:

RUN pip3 install ptvsd==3.0.0
Run Code Online (Sandbox Code Playgroud)

也可以在本地运行ptvsd安装:

$pip3 install ptvsd==3.0.0
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请访问https://code.visualstudio.com/docs/python/debugging#_remote-debugging, 这对我有用,希望对您有所帮助。


Tar*_*ani 3

8 月 12 日编辑

我设置了一个测试版本来看看可能出现什么问题。问题是 Visual Studio Code 不会连接到调试器,它在仅连接之前失败

查看异常是在他们的 JS 代码中。

Visual Studio 错误日志

github上也有一个开放的问题

https://github.com/DonJayamanne/pythonVSCode/issues/805

您最好的选择是将这些详细信息添加到问题中或打开一个新问题

原答案:

您所看到的行为实际上是正确的。我看到了你的屏幕截图,你在客户端脚本中打印了“Hello World”,下面的代码是你的远程代码

import ptvsd
ptvsd.enable_attach('my_secret', address=('0.0.0.0', 7102))
ptvsd.wait_for_attach()
Run Code Online (Sandbox Code Playgroud)

如果您看到以下网址

https://donjayamanne.github.io/pythonVSCodeDocs/docs/debugging_remote-debugging/

阅读下面的引言

在两个脚本文件(即本地和远程计算机上的脚本)中进行上述更改,但是在客户端,确保上面两行被注释掉,即这对于确保我们在服务器上具有相同的行号并且它们是必要的匹配。

代码调试的执行全部发生在容器内。而本地机器中的代码更多的是能够可视化容器内的代码是哪一行