用VScode代码调试Python
Python扩展支持许多类型的Python应用程序的调试,包括以下一般功能:
- 观看窗口
- 评估表达式
- 当地人
- 参数
- 扩大孩子
- 断点
- 条件断点
- 暂停(进入)正在运行的程序
- 自定义启动目录
要熟悉这些常规功能,请查看VS Code调试文章。本文仅讨论那些特定于Python的注意事项。
选择一个配置
要选择调试配置,请选择边栏中的调试视图,然后从下拉列表中选择一个选项:
在调试时,状态栏显示左下角的当前配置,当前的调试解释器位于右侧。选择配置会显示列表,您可以从中选择不同的配置:
默认情况下,调试器使用与python.pythonPath
VS 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
标识要使用的调试器的类型; 将此设置留给python
Python代码。
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
下一步
- Python环境 - 控制哪个Python解释器用于编辑和调试。
- 单元测试 - 配置单元测试环境并发现,运行和调试测试。
- 设置参考 - 探索VS Code中与Python相关的所有设置。
- 一般调试 - 了解VS Code的调试功能。
常用软件开发学习资料目录:
1.经典编程电子书收藏
2.C&C++编程学习资料收藏
3.算法及数据结构(有关c,c++,java)
4.Java开发学习资料收藏
5.Android开发学习资料收藏
6.Python开发学习资料收藏
7.大数据,机器学习,人工智能资料收藏
8.Docker资料收藏
用VScode代码调试Python的更多相关文章
- 如何在vscode中调试python scrapy爬虫
本文环境为 Win10 64bit+VS Code+Python3.6,步骤简单罗列下,此方法可以不用单独建一个Py入口来调用命令行 安装Python,从官网下载,过程略,这里主要注意将python目 ...
- windows下使用vscode编写运行以及调试Python
更新于2018年10月: 首先去python官网下载python3 地址:https://www.python.org/downloads/windows/ 下载好后直接安装 记得勾选添加环境变量 ...
- [置顶] 如何在Python IDLE中调试Python代码?
好久没有用Python了,居然忘记了怎么在Python IDLE中调试Python代码.百度了一下,然后还是写下来吧,以免以后又忘记了. 1. Set break point in the sourc ...
- #7 Python代码调试
前言 Python已经学了这么久了,你现在已经长大了,该学会自己调试代码了!相信大家在编写程序过程中会遇到大量的错误信息,我也不例外的啦-遇到这些问题该怎么解决呢?使用最多的方法就是使用print打印 ...
- Python - 调试Python代码的方法
调试(debug) 将可疑环节的变量逐步打印出来,从而检查哪里是否有错. 让程序一部分一部分地运行起来.从核心功能开始,写一点,运行一点,再修改一点. 利用工具,例如一些IDE中的调试功能,提高调试效 ...
- 【转载】PDB命令行调试Python代码
转载自这里. (博主按:PDB调试python代码和用GDB调试c++代码很类似) 你有多少次陷入不得不更改别人代码的境地?如果你是一个开发团队的一员,那么你遇到上述境地的次数比你想要的还要多.然而, ...
- linux系统下如何在vscode中调试C++代码
本篇博客以一个简单的hello world程序,介绍在vscode中调试C++代码的配置过程. 1. 安装编译器 vscode是一个轻量的代码编辑器,并不具备代码编译功能,代码编译需要交给编译器完成. ...
- linux操作系统下调试python代码方法
一.python有调试工具pdb,可以用来进行代码调试. pdb的常用命令说明: l #查看运行到哪行代码 n #单步运行,跳过函数 s #单步运行,可进入函数 p 变量 #查看变量值 b 行号 #断 ...
- 【转载】Python 代码调试技巧
https://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/ Python 代码调试技巧 张 颖2012 年 5 月 03 日发布 ...
随机推荐
- luogu P1776 宝物筛选_NOI导刊2010提高(02)
Sto flashhu orz flash太强啦 多重背包裸题(逃 使用压维大法,\(f_i\)为总重量为\(i\)时的答案 对于每种物品,记\(w\)为单个的重量,\(v\)为单个的价值,\(m\) ...
- 第16月第17天 contentMode
1. self.contentMode = UIViewContentModeScaleAspectFill; self.clipsToBounds = YES; http://blog.csdn.n ...
- npm快捷键
一.npm基本快捷键 node -v查看安装的nodejs版本,出现版本号,说明刚刚已正确安装nodejs.PS:未能出现版本号,请尝试注销电脑重试: npm -v查看npm的版本号,npm是在安装n ...
- 改环境变量改出问题了,vi,ls这些命令都不能用了,怎么办
1.出现这个问题肯定是以前的基本环境变量都用不了了(大部分情况就是多了一个空格) 解决办法: cd /usr/bin 下执行vi命令 修改环境变量 然后source /etc/profile ...
- jQuery中对未来的元素绑定事件用bind、live or on
对未来的元素绑定事件不能用bind, 1.可以用live代替,但是要注意jquery的版本,根据官方文档,从1.7开始就不推荐live和delegate了,1.9里就去掉live了. 2.推荐用on代 ...
- 驱动开发--【字符设备、块设备简介】【sky原创】
驱动开发 字符设备,块设备,网络设备 字符设备 以字节流的方式访问, 不能随机访问 有例外,显卡.EEPROM可以随机访问 EEPROM可以擦写1亿次,是一种字符设备,可以随机访问 读写是 ...
- c# webbrowser控件内核版本强制修改
int BrowserVer, RegVal; // get the installed IE version using (WebBrowser Wb = new WebBrowser()) Bro ...
- nodejs 访问网站并操作xpath
var xpath = require('xpath'); //引用xpath包 var dom = require('xmldom-silent').DOMParser;//引用xmldom包 va ...
- mybatis主键自增长
在数据库中建序列:SEQ_T_RESOURCE 第一种:会在传入该方法的的参数集合中添加主键元素,相当于:map.put("RES_ID",xxx); <insert id= ...
- 随机生成三个数(break用法)