本文介绍教程系列中的步骤 4: 在 Visual Studio 中使用 Python。
Visual Studio 提供管理项目、丰富的编辑体验、 交互式窗口和 Python 代码功能齐全的调试的功能。 在本教程系列的步骤 4 中,使用 调试器 逐步运行代码,包括循环的每个迭代。 在 调试器中,只要某些条件为 true,就可以暂停程序。 在暂停程序时,可以随时检查整个程序状态并更改变量的值。 此类作对于跟踪程序 bug 至关重要,还有助于遵循确切的程序流。
在本教程的步骤 4 中,你将了解如何:
- 在 Visual Studio 中的 调试器 中运行 Python 代码
- 设置断点和条件
- 检查程序状态和更改变量
- 浏览 调试器 窗口和作
先决条件
- 包含 Python 文件(.py)的 Python 应用程序项目,其中包含 在步骤 2 中创建的代码:编写并运行 Python 代码 和 步骤 3:使用本教程的交互式 REPL 窗口 。
准备 Python 文件
若要准备调试练习,请按照以下步骤更新 Python 项目文件,以包含更可靠的代码:
在编辑器中打开 Python 项目文件(.py)。
将文件中的代码替换为以下代码。 此版本的代码扩展了函数,
make_dot_string
以便可以在调试器中检查其离散步骤。 它将循环移动到for
函数main
中,然后通过调用函数main
显式运行该循环:from math import cos, radians # Create a string with spaces proportional to a cosine of x in degrees def make_dot_string(x): rad = radians(x) # cos works with radians numspaces = int(20 * cos(rad) + 20) # Scale to 0-40 spaces st = ' ' * numspaces + 'o' # Place 'o' after the spaces return st def main(): for i in range(0, 1800, 12): s = make_dot_string(i) print(s) main()
开始调试
现在,你已准备好开始在 调试器中检查更新的 Python 代码。
通过在工具栏上选择 “调试>开始调试 ”或使用 F5 键盘快捷方式来确认代码是否正常工作。 这些命令在 调试器中运行代码。
调试器不会检测到任何问题,因此程序成功运行。 此时会打开一个输出窗口,可以看到余弦波模式的几次迭代。 选择任意键以关闭输出窗口。
小窍门
若要在程序完成后自动关闭输出窗口,请选择 “工具>选项”,展开 “Python>调试 ”选项卡,并清除 进程正常退出时等待输入 选项。
使用以下方法之一在
for
循环语句上设置断点:- 在代码行的左边距中选择。
- 右键单击代码行,然后选择“断点插入断点>”。
- 将插入插入插入点放在代码行中,然后选择 “调试>切换断点 ”(或使用 F9 键盘快捷方式)。
断点在标记点停止执行代码,以便可以检查程序状态。 在每个设置了断点的行上都会出现一个红点。
再次启动 调试器 (F5)。 程序的运行代码在具有设置断点的行中停止。 现在可以检查调用堆栈,并检查正在运行的程序代码的此状态的变量。
Visual Studio 提供了多种观察程序代码和执行数据的方法,包括以下窗口:
- 调用堆栈显示程序代码的函数和方法调用的历史记录。
- 作用域内定义的变量将显示在 “自动” 窗口中。
- “局部变量”视图显示 Visual Studio 在当前范围(包括函数)中找到的所有变量,甚至在代码中定义它们之前也是如此。
若要查看可用窗口和作的完整列表,请选择 “调试>Windows”。
可以在遇到断点时打开 调试器 窗口以查看程序状态:
使用调试器作
当 Visual Studio 在断点停止代码执行时,可以使用多个命令逐步执行代码或运行代码块,然后再再次中断。 这些命令在 Visual Studio 的几个位置可用,包括 调试器 工具栏、调试 菜单、代码编辑器中的右键单击上下文菜单,以及通过键盘快捷方式。
Visual Studio 窗口顶部的 调试器 工具栏提供对最常见调试命令的快速访问:
下表汇总了这些命令,因为它们在工具栏上从左到右显示:
行动 | 快捷方式 | DESCRIPTION |
---|---|---|
Continue | F5 | 运行代码,直到到达下一个断点或程序完成为止。 |
全部中断 | Ctrl+Alt+破 | 暂停长时间运行的程序。 |
停止调试 | 转变+F5 系列 | 在当前点停止程序,然后退出 调试器。 |
重启 | Ctrl+转变+F5 | 在当前点停止程序,并从 调试器中开始重启程序执行。 |
显示下一语句 | Alt+Num+\ | 返回到在代码中运行的下一个语句。 此命令可帮助你在代码中找到 调试器 停止的位置。 |
Step Into | F11 | 运行下一个语句并停止。 如果下一个语句是对函数的调用, 调试器 将单步执行该函数并在第一行停止。 |
Step Over | F10 | 运行下一个语句,包括调用函数(运行其所有代码)并应用任何返回值。 此命令允许你轻松跳过不需要调试的函数。 |
步出 | ShiftF11+ | 运行代码,直到当前函数的末尾,然后单步执行调用语句并暂停。 当不需要调试当前函数的其余部分时,此命令非常有用。 |
按照以下步骤在 Python 代码中使用 调试器 作:
使用“单步故障转移”作单步执行
for
循环语句。单步执行 会导致 调试器 运行当前代码行,包括任何调用的函数,并立即再次暂停。 单步执行后,请注意变量
i
现在在 “局部变量 ”和 “自动” 窗口中定义。单步执行 下一行代码,用于调用
make_dot_string
函数。在此实例中, “单步执行” 会导致 调试器 运行完整的
make_dot_string
函数,并在函数返回后暂停。 除非存在单独的断点,否则 调试器 不会停止在函数内部。继续多次单步执行代码,并观察 局部变量 或 自动 窗口中的值如何更改。
在“ 局部变量 ”或“ 自动” 窗口中,双击变量的 “值 ”列以编辑该值。 在此示例中,将
s
变量的值更改为'Hello, Python Application'
。 请务必将值括在单引号中。 选择 Enter 或值以外的任何区域以应用更改。使用 单步执行 代码,直到调用
make_dot_string
函数为止。对于函数, 单步执行作 会导致 调试器 同时调用函数,并单步执行函数代码。 调试过程位于函数内时,可以检查其局部变量,并专门逐步执行其代码。 在此示例中, “单步执行” 作将移动到函数中
make_dot_string
。继续单步执行 单 步执行,直到函数
make_dot_string
返回。到达函数代码的
make_dot_string
末尾时,下一步将使用变量中的s
新返回值将调试器for
返回到循环。再次单步执行语句时
print
,请注意语句上的print
“单步执行作”不会进入该函数。 此行为是因为函数print
未用 Python 编写。 它是 Python 运行时中的本机代码。继续使用 “单步执行” ,直到再次
make_dot_string
进入函数,然后使用 Step Out 并注意到 调试器 返回到for
循环。使用 Step Out, 调试器 将运行函数的其余部分,然后在调用代码中自动暂停。 在逐步执行较长函数的某些部分并结束对函数的观察之后,此作非常有用。 单步执行 剩余代码,或直到它到达调用代码中设置的显式断点为止。
使用 Continue (F5) 继续运行程序,直到到达下一个断点。 由于循环中
for
设置了断点,因此在下一次迭代中中断。可以通过观察“局部变量”窗口中变量的更改值
s
来确认程序是否继续执行。
使用断点条件
单步执行循环的数百次迭代可能很繁琐,因此 Visual Studio 允许向断点添加 条件 。 设置断点条件时, 调试器 仅在满足条件时才在断点处暂停程序。
以下步骤演示如何在循环语句上 for
定义断点条件,以便 调试器 仅在变量的值 i
超过 1600 时暂停:
若要设置断点条件,请右键单击红色断点并选择 “条件 ”或使用键盘快捷方式 Alt+F9>C。
在“ 断点设置” 弹出对话框中,配置以下设置以创建 条件:
将条件类型设置为 条件表达式。
将条件求值定义为 True。
输入
i > 1600
为条件值。选择 关闭。
选择 F5 以继续调试和程序执行。 观察程序在到达条件断点之前运行多次迭代。
可以确认 调试器 在到达条件断点时正确暂停程序执行。 满足条件后,“局部变量”窗口将显示
i
变量值。1608
若要运行程序以完成,可以禁用断点并继续执行程序。
将鼠标悬停在红点上并选择“ 禁用”,或右键单击红点并选择“ 禁用断点”。
选择 “继续 ”(或按 F5)运行程序。
程序结束时,Visual Studio 将停止调试会话并返回到编辑模式。
还可以删除断点。 选择红点或右键单击该点,然后选择“ 删除断点”。 此作还会删除任何定义的条件。
小窍门
在某些情况下(如启动 Python 解释器本身失败),程序完成后 Python 输出窗口可能会立即关闭,而不会暂停并显示 “按任何键继续 提示”。 若要强制暂停和提示,请将-i
参数添加到“调试”选项卡上的“运行>解释器参数”字段。此参数使 Python 解释器在代码运行后进入交互模式。 程序等待你选择 Ctrl+Z+Enter 关闭窗口。