Python扩展支持许多类型的Python应用程序的调试,包括以下一般功能:
观看窗口
评估表达式
当地人
参数
扩大孩子
断点
条件断点
暂停(进入)正在运行的程序
自定义启动目录
要熟悉这些常规功能,请查看VS Code调试文章。本文仅讨论那些特定于Python的注意事项。
选择一个配置
要选择调试配置,请选择边栏中的调试视图,然后从下拉列表中选择一个选项:
在调试时,状态栏显示左下角的当前配置,当前的调试解释器位于右侧。选择配置会显示列表,您可以从中选择不同的配置:
默认情况下,调试器使用与python.pythonPathVS Code其他功能相同的设置。要使用不同的解释器,请pythonPath在调试器设置中设置该值。或者,在状态栏上选择指定的解释器以选择不同的解释器。
注:调试器设置不支持相对路径,包括依赖主python.pythonPath设置时。要解决此问题,请使用环境变量,或者创建一个变量,例如${workspaceFolder}解析到您的项目文件夹,然后在该路径中使用该变量,如in "python.pythonPath": "${workspaceFolder}/venv/bin/python"。
要查看所有配置,请launch.json通过选择配置下拉列表旁边的齿轮图标打开:
下一节将介绍默认或标准的“Python:当前文件”配置。本文还介绍了调试特定应用程序类型下的其他配置。
注意:如果您想尝试新的实验性调试器,请参阅Issue 538(GitHub)上的说明。
标准配置和选项
标准配置为launch.json:
{
"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命名的父对象中osx,windows或者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代码本地执行一个程序,同时在远程计算机上执行它。在这种情况下,必须在两台计算机上都有源代码。
在开发和远程计算机上,安装ptvsd 3.0.0(3.0.0 完全版本- 更高版本尚不支持#514)。
在两台计算机的源代码中,添加以下行,用适当的密码替换_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()
仅在远程计算机上,取消注释上面的最后一行。您希望在开发机器上保留注释行,以确保两台机器上的源代码与行符合。
启动远程程序。
选择附加(远程调试)(下面)配置,然后修改remoteRoot为指向该程序的远程计算机上的位置,并修改host,port以及secret在上面添加的源代码中的值匹配。
{
"name": "Attach (Remote Debug)",
"type": "python",
"request": "attach",
"localRoot": "${workspaceFolder}",
"remoteRoot": "${workspaceFolder}",
"port": 3000,
"secret": "my_secret",
"host": "localhost"
}
通过SSH进行调试
视窗:
使用sshd_config或类似命令在远程计算机上启用ssh端口转发。
建立一个PuTTY SSH隧道:阅读使用PuTTY设置SSH隧道(直到“打开会话”部分)。
在“隧道”屏幕上,使用本地模式,源端口(本地计算机上的入口点端口)可能与目标端口(服务器上的端点)不同。
目标地址应该是本地主机或127.0.0.1地址(这是远程SSH服务器用于建立隧道的地址)。
Linux的:
跑 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。
下载ptvsd并将其文件解压缩到工作文件夹中的ptvsd文件夹中。(如果使用不同的文件夹,请修改pydev_startup.py步骤4中创建的文件中的路径)。
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"
]
}
]
}
在Windows和Linux上,将第一项内容替换args为安装Google App Engine的路径(上面的源代码中显示的路径适用于MacOS)。
在您的项目根目录下创建一个名为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")
launch.json使用Attach(远程调试)配置作为模板创建配置。确保秘密和端口值与上面源代码中的内容匹配。
添加"preLaunchTask": "python"到launch.json。
从命令面板中,运行“ 运行构建任务”命令。这将打开任务输出窗口,您可以在其中看到各种消息。
一旦看到消息“Google App Engine已启动,准备好连接调试器”,请使用远程调试配置启动VS Code调试器。
在需要的地方设置断点,然后启动浏览器以启动应用程序。
故障排除
调试器可能无法正常工作的原因很多。调试控制台经常会显示具体原因,但有两个具体原因如下:
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