用VScode代码调试Python

Python扩展支持许多类型的Python应用程序的调试,包括如下通常功能:

  • 观看窗口
  • 评估表达式
  • 当地人
  • 参数
  • 扩大孩子
  • 断点
  • 条件断点
  • 暂停(进入)正在运行的程序
  • 自定义启动目录

要熟悉这些常规功能,请查看VS Code调试文章。本文仅讨论那些特定于Python的注意事项。html

选择一个配置

要选择调试配置,请选择边栏中的调试视图,而后从下拉列表中选择一个选项:java

选择调试配置

在调试时,状态栏显示左下角的当前配置,当前的调试解释器位于右侧。选择配置会显示列表,您能够从中选择不一样的配置:python

调试状态栏

默认状况下,调试器使用与python.pythonPathVS Code其余功能相同的设置。要使用不一样的解释器,请pythonPath在调试器设置中设置该值或者,在状态栏上选择指定的解释器以选择不一样的解释器。linux

:调试器设置不支持相对路径,包括依赖主python.pythonPath设置时。要解决此问题,请使用环境变量,或者建立一个变量,例如${workspaceFolder}解析到您的项目文件夹,而后在该路径中使用该变量,如in "python.pythonPath": "${workspaceFolder}/venv/bin/python"c++

要查看全部配置,请launch.json经过选择配置下拉列表旁边的齿轮图标打开git

调试设置图标

下一节将介绍默认或标准的“Python:当前文件”配置。本文还介绍了调试特定应用程序类型下的其余配置github

注意:若是您想尝试新的实验性调试器,请参阅Issue 538(GitHub)上的说明算法

标准配置和选项

标准配置为launch.jsonshell

{
    "name": "Python: Current File", "type": "python", "request": "launch", "program": "${file}", } 

如下各节介绍各类设置的自定义配置。编程

name

提供出如今VS Code下拉列表中的调试配置的名称。

type

标识要使用的调试器的类型; 将此设置留给pythonPython代码。

request

指定开始调试的模式:

  • launch:在中指定的文件上启动调试器 program
  • attach:将调试器附加到已经运行的进程。有关示例,请参阅远程调试

program

提供python程序入口模块的彻底限定路径。推荐值为${file},它使用编辑器中的活动文件。可是,对于具备多个文件的程序,您能够指定程序的启动文件。例如:

"program": "/Users/Me/Projects/PokemonGo-Bot/pokemongo_bot/event_handlers/__init__.py", 

您还能够依赖工做区根目录中的相对路径。例如,若是根是/Users/Me/Projects/PokemonGo-Bot那么你可使用如下内容:

"program": "${workspaceFolder}/pokemongo_bot/event_handlers/__init__.py", 

pythonPath

指向Python解释器用于调试目的。若是未指定,则默认为python.pythonPath设置中标识的解释器,这至关于使用该值${config:python.pythonPath}要使用不一样的解释器,请改成指定其路径。

您能够经过将指定特定于平台的路径pythonPath命名的父对象中osxwindows或者linux例如,PySpark的配置使用如下值:

"osx": { "pythonPath": "^\"\\${env:SPARK_HOME}/bin/spark-submit\"" }, "windows": { "pythonPath": "^\"\\${env:SPARK_HOME}/bin/spark-submit.cmd\"" }, "linux": { "pythonPath": "^\"\\${env:SPARK_HOME}/bin/spark-submit\"" }, 

args

指定传递给Python程序的参数,例如:

"args": [ "--quiet", "--norepeat" ], 

stopOnEntry

设置为true时,在调试程序的第一行中断开调试器。若是省略(默认)或设置为false,则调试器将程序运行到第一个断点。

console

指定如何显示程序输出。

显示输出的地方
"none" VS代码调试控制台
"integratedTerminal" (默认) VS代码集成终端
"externalTerminal" 独立控制台窗口

cwd

指定调试器的当前工做目录,它是代码中使用的任何相对路径的基础文件夹。若是省略,默认为${workspaceFolder}(在VS代码中打开的文件夹)。

做为一个例子,说${workspaceFolder}包含一个py_code文件夹包含app.py,和一个data文件夹包含salaries.csv若是启动调试器py_code/app.py,则数据文件的相对路径根据如下值而变化cwd

CWD 数据文件的相对路径
省略或 ${workspaceFolder} data/salaries.csv
${workspaceFolder}/py_code ../data/salaries.csv
${workspaceFolder}/data salaries.csv

debugOptions

一系列可能包含如下内容的附加选项:

选项 描述
"RedirectOutput"(默认) 使调试器将程序的全部输出打印到VS Code调试输出窗口中。若是省略此设置,则全部程序输出不显示在调试器输出窗口中。该选项在使用时一般会被省略,"console": "integratedTerminal"或者"console": "externalTerminal"由于不须要在调试控制台中复制输出。
"DebugStdLib" 启用标准库函数的调试。
"Django" 激活特定于Django Web框架的调试功能。
"Sudo" 与...一块儿使用时"console": "externalTerminal",容许调试须要提高的应用程序。捕获密码须要使用外部控制台。
"Pyramid" 在调试金字塔应用程序时使用。

env

为除调试器始终继承的系统环境变量以外的调试器进程设置可选的环境变量。

envFile

包含环境变量定义的文件的可选路径。请参阅配置Python环境 - 环境变量定义文件

调试特定的应用程序类型

配置下拉菜单为常规应用程序类型提供了各类不一样的选项:

组态 描述
PySpark 使用PySpark而不是默认解释器运行程序,使用pythonPath前面在pythonPath选项下显示的特定于平台的值
Python模块 替换program设置"module": "module.name"以调试特定模块。使用此配置时,请将该值替换为所需的模块名称。
集成终端/控制台 "console": "integratedTerminal"选项添加到标准配置。
外部终端/控制台 "console": "externalTerminal"选项添加到标准配置。
Django的 指定"program": "${workspaceFolder}/manage.py""args": ["runserver", "--noreload", "--nothreading"]添加“Django”和“RedirectOutput” debugOptions请注意,在调试时不能自动从新加载Django应用程序。要调试Django HTML模板,请添加断点templates
烧瓶 请参阅下面的Flask调试
金字塔 删除program,添加"args": ["${workspaceFolder}/development.ini"]并添加“金字塔”和“重定向输出” debugOptions
沃森 指定"program": "${workspaceFolder}/console.py""args": ["dev", "runserver", "--noreload=True"]
Scrapy 指定"program": "~/.virtualenvs/scrapy/bin/scrapy",添加"console": "integratedTerminal"选项并添加"args": ["crawl", "specs", "-o", "bikes.json"]
附加(远程调试) 请参阅如下远程调试

远程调试和Google App Engine还须要具体步骤。有关调试单元测试(包括nosetest)的详细信息,请参阅单元测试

要调试须要管理员权限的应用程序,请在中使用"console": "externalTerminal"并包含“Sudo” debugOptions

烧瓶调试

{
    "name": "Flask", "type": "python", "request": "launch", "stopOnEntry": false, "pythonPath": "${config:python.pythonPath}", "module": "flask", "cwd": "${workspaceFolder}", "env": { "FLASK_APP": "${workspaceFolder}/app.py" }, "args": [ "run", "--no-debugger", "--no-reload" ] }, 

正如你所看到的,这个配置指定"stopOnEntry": false"env": {"FLASK_APP": "${workspaceFolder}/app.py"}"args": ["run", "--no-debugger","--no-reload"]"module": "flask"属性被用来代替program

远程调试

远程调试容许您在VS代码本地执行一个程序,同时在远程计算机上执行它。在这种状况下,必须在两台计算机上都有源代码。

  1. 在开发和远程计算机上,安装ptvsd 3.0.03.0.0 彻底版本- 更高版本尚不支持#514)。

  2. 在两台计算机的源代码中,添加如下行,用适当的密码替换my_secret以验证远程调试,并用合适的IP地址(或)和端口号替换地址localhost

    import ptvsd ptvsd.enable_attach("my_secret", address = ('0.0.0.0', 3000)) # Enable the line of source code below only if you want the application to wait until the debugger has attached to it #ptvsd.wait_for_attach() 
  3. 仅在远程计算机上,取消注释上面的最后一行。您但愿在开发机器上保留注释行,以确保两台机器上的源代码与行符合。

  4. 启动远程程序。

  5. 选择附加(远程调试)(下面)配置,而后修改remoteRoot为指向该程序的远程计算机上的位置,并修改hostport以及secret在上面添加的源代码中的值匹配。

    {
        "name": "Attach (Remote Debug)", "type": "python", "request": "attach", "localRoot": "${workspaceFolder}", "remoteRoot": "${workspaceFolder}", "port": 3000, "secret": "my_secret", "host": "localhost" } 

经过SSH进行调试

视窗:

  1. 使用sshd_config或相似命令在远程计算机上启用ssh端口转发。
  2. 创建一个PuTTY SSH隧道:
    1. 阅读使用PuTTY设置SSH隧道(直到“打开会话”部分)。
    2. 在“隧道”屏幕上,使用本地模式,源端口(本地计算机上的入口点端口)可能与目标端口(服务器上的端点)不一样。
    3. 目标地址应该是本地主机或127.0.0.1地址(这是远程SSH服务器用于创建隧道的地址)。

Linux的:

  1. 跑 ssh -L sourceport:localhost:destinationport user@remoteaddress

接下来,验证您能够在SSH会话中看到提示。而后打开VS Code并将端口配置为显示在Tunnels屏幕上的调试端口。

最后,启动程序并按照上一节所述附加调试器。

Google App Engine调试

Google App Engine本身启动一个应用程序,所以在VS Code调试器中启动它不是直接可能的。相反,咱们须要在应用中使用ptvsd,而后以容许VS Code附加其调试器的模式启动Google App Engine。

调试Google App Engine

  1. 下载ptvsd并将其文件压缩到工做文件夹中的ptvsd文件夹中。(若是使用不一样的文件夹,请修改pydev_startup.py步骤4中建立文件中的路径)。

  2. tasks.json使用如下内容建立一个文件:

    {
        "version": "2.0.0", "tasks": [ { "label": "Launch Google App Engine", "command": "python", "type": "shell", "args": [ "/usr/local/google_appengine/dev_appserver.py", "--python_startup_script=${workspaceFolder}/pydev_startup.py", "--automatic_restart=no", "--max_module_instances=default:1", "${workspaceFolder}/app.yaml" ] } ] } 
  3. 在Windows和Linux上,将第一项内容替换args为安装Google App Engine的路径(上面的源代码中显示的路径适用于MacOS)。

  4. 在您的项目根目录下建立一个名为pydev_startup.py的文件,其中包含如下内容,并按照说明修改:

    import sys import os #Assuming that pdvsd is located in the working folder sys.path.append(os.getcwd()) import ptvsd # Modify the secret and port number as desired; you're debugging locally so the values don't matter. # However, be sure the port is not blocked on your computer. ptvsd.enable_attach(secret = 'gae', address = ('0.0.0.0', 3000)) #The debug server has started and you can now use VS Code to attach to the application for debugging print("Google App Engine has started, ready to attach the debugger") 
  5. launch.json使用Attach(远程调试)配置做为模板建立配置确保秘密和端口值与上面源代码中的内容匹配。

  6. 添加"preLaunchTask": "python"launch.json

  7. 从命令面板中,运行“ 运行构建任务”命令。这将打开任务输出窗口,您能够在其中看到各类消息。

  8. 一旦看到消息“Google App Engine已启动,准备好链接调试器”,请使用远程调试配置启动VS Code调试器。

  9. 在须要的地方设置断点,而后启动浏览器以启动应用程序。

故障排除

调试器可能没法正常工做的缘由不少。调试控制台常常会显示具体缘由,但有两个具体缘由以下:

  • python可执行文件的路径不正确:请检查pythonPath用户设置中的值

  • 观察窗口中的表达式无效(请参阅下面的示例):清除Watch窗口中的全部表达式并从新启动调试器。

    Traceback (most recent call last):
      File ".../visualstudio_py_debugger.py", line 1646, in loop cmd() File ".../visualstudio_py_debugger.py", line 1918, in command_execute_code thread.run_on_thread(text, cur_frame, eid, frame_kind, repr_kind) File ".../visualstudio_py_debugger.py", line 1246, in run_on_thread self.schedule_work(lambda : self.run_locally(text, cur_frame, execution_id, frame_kind, repr_kind)) File ".../visualstudio_py_debugger.py", line 1238, in schedule_work self.unblock() File ".../visualstudio_py_debugger.py", line 1234, in unblock self._block_lock.release() RuntimeError: release unlocked lock 

下一步

  • Python环境 - 控制哪一个Python解释器用于编辑和调试。
  • 单元测试 - 配置单元测试环境并发现,运行和调试测试。
  • 设置参考 - 探索VS Code中与Python相关的全部设置。
  • 通常调试 - 了解VS Code的调试功能。

 

相关文章
相关标签/搜索