PyCharm和VS Code中运行与调试Python代码的方法
详细讲解在PyCharm和VS Code中配置Python解释器、运行脚本以及利用断点、单步调试、变量监视与异常捕获进行代码排错的具体操作步骤与核心差异。
一、准备工作:准确绑定 Python 解释器
无论使用哪款工具,代码能否成功运行并加载第三方包,取决于 IDE 当前选择的 Python 解释器路径。如果解释器选择错误,终端中明明已经安装的模块,在代码执行时依然会抛出 ModuleNotFoundError。
1. PyCharm 中的解释器配置
打开项目后,进入设置菜单:Windows/Linux 用户点击 File > Settings,macOS 用户点击 PyCharm > Settings (Preferences),在左侧导航栏展开 Project: [项目名称] > Python Interpreter。
- 使用已有虚拟环境:点击齿轮图标或下拉框右侧的 Add Interpreter > Add Local Interpreter,选择 Existing,在
Path栏浏览选择虚拟环境目录下的 Python 可执行文件(如 Linux/macOS 的venv/bin/python,Windows 的venv\Scripts\python.exe)。 - 快速确认状态:配置完成后,观察 PyCharm 窗口右下角的状态栏,那里会直接显示当前激活的解释器名称与版本号。如果右下角有进度条在索引依赖包(Indexing),等待其索引完毕后代码中的包导入警告即可消除。
2. VS Code 中的解释器选择
VS Code 依赖微软官方出品的 Python 扩展插件(扩展商店搜索 ms-python.python 安装)。安装插件后,操作步骤如下:
- 按下快捷键 Ctrl+Shift+P(macOS 为 Cmd+Shift+P)调出全局命令面板。
- 在输入框输入并选择 Python: Select Interpreter。
- 列表中会自动扫描全局环境、Conda 环境及当前项目根目录下的
.venv虚拟环境。直接点击选择对应项;如果未自动列出,可点击 Enter interpreter path... 手动粘贴解释器完整绝对路径。 - 确认方式:检查 VS Code 底部状态栏右侧,能看到诸如
Python 3.11.x ('venv': venv)的标签,即表示解释器绑定成功。
二、PyCharm 中运行与调试 Python 代码
PyCharm 作为全功能 IDE,集成了开箱即用的运行与调试工具条,无需编写额外的配置文件即可针对单脚本进行交互式排错。
1. 直接运行脚本
当只需要验证代码执行结果、不需要逐步中断时,可以使用直接运行模式:
- 方法一(右键菜单):在代码编辑区域的任意空白处单击鼠标右键,在弹出菜单中选择 Run '文件名'(快捷键为 Shift+F10,macOS 为 Ctrl+R)。
- 方法二(行号槽位运行):如果脚本中包含
if __name__ == '__main__':入口,该代码行左侧的行号槽(Gutter)会出现一个绿色三角形播放按钮,点击后选择 Run '文件名'。 - 执行结果:窗口下方会自动弹出 Run 工具窗口,显示执行的命令行及标准输出,执行完毕后显示进程退出码(如
Process finished with exit code 0)。
2. 断点设置与启动调试
当程序运行输出异常或抛出非预期错误时,需要通过断点让程序在指定位置暂停:
- 打下基础断点:在需要检查的代码行号右侧空白槽位单击一下,会出现一个深红色的实心圆点,该行背景也会微弱泛红,代表断点已放置。
- 启动调试会话:在编辑器内右键选择 Debug '文件名',或点击右上角绿色小虫子图标(快捷键为 Shift+F9,macOS 为 Ctrl+D)。
- 界面反馈:程序启动后全速执行,直到即将执行断点所在行时被挂起。此时断点行会高亮显示(通常为蓝色条),底部的 Debug 工具窗口自动打开。
3. 调试面板核心交互操作
程序挂起后,利用调试工具栏对代码流进行控制:
- Step Over(单步跳过,F8):执行当前高亮行,并停在下一行。如果当前行调用了某个函数,调试器会在后台完整执行该函数,而不会跳进该函数内部。适合对已知无误的代码行进行快速跳过。
- Step Into(单步跳入,F7):如果当前行包含函数调用,按此键会深入到该函数的内部第一行,方便检查函数传参及局部计算逻辑。
- Step Out(单步跳出,Shift+F8):当已经步入一个函数并看清逻辑后,按此键可让程序执行完该函数的剩余代码,直接跳回到上一层调用者所在行。
- Resume Program(恢复程序,F9):取消当前挂起,让代码继续全速运行,直到遇到下一个断点或脚本结束。
- Variables 变量区与即时求值(Alt+F8):调试窗口右下方的 Variables 面板会自动列出当前作用域的所有局部变量和全局变量及其当前取值;选中任意变量按下 Alt+F8 呼出 Evaluate Expression 弹窗,可在其中输入临时 Python 表达式(例如
len(items) > 0或user['age'] + 1)实时观察计算结果,无需修改原源码。
Condition 输入框中输入 Python 逻辑表达式,如 i == 100 或 status_code != 200。点击 Done 保存后,调试器只有在条件为 True 时才会暂停程序。
三、VS Code 中运行与调试 Python 代码
VS Code 采用模块化与语言适配器设计。在进行 Python 调试时,VS Code 通过 Debug Adapter Protocol (DAP) 与官方的 debugpy 调试引擎协同工作。
1. 快速单文件运行与单文件调试
对于结构简单的独立 Python 脚本,无需复杂配置即可直接启动:
- 直接运行:打开
.py文件后,点击编辑器右上角的三角形播放按钮下拉菜单,选择 Run Python File。VS Code 会在下方的集成终端(Terminal)自动激活虚拟环境并执行python filename.py。 - 直接调试:在需要暂停的代码行号左侧单击鼠标放置红点断点,然后点击右上角三角形旁的下拉箭头,选择 Debug Python File。系统会自动调起
debugpy,并在命中断点时在窗口顶部弹出悬浮调试工具条。
2. 进阶调试:配置 launch.json
当需要向脚本传递命令行参数(CLI arguments)、注入自定义环境变量,或调试 Flask/Django 等 Web 应用时,创建 launch.json 配置文件是标准做法:
- 点击左侧活动栏的 运行和调试 图标(快捷键 Ctrl+Shift+D / macOS 为 Cmd+Shift+D)。
- 如果项目尚未创建配置,点击 创建 launch.json 文件,在弹出的模板列表中选择 Python Debugger,再选择 Python File (调试当前打开的 Python 文件)。
- VS Code 会在项目根目录生成
.vscode/launch.json文件。
典型的单脚本调试配置结构如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: 调试当前文件带参数",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": true,
"args": ["--input", "data.json", "--verbose"],
"env": {
"APP_ENV": "development"
}
}
]
}
3. VS Code 调试侧边栏与悬浮条
在配置好或直接启动调试(快捷键 F5)后,程序在断点处挂起,VS Code 提供以下核心观测区域:
- 悬浮控制条:自左向右依次为:Continue(继续,F5)、Step Over(单步跳过,F10)、Step Into(单步跳入,F11)、Step Out(单步跳出,Shift+F11)、Restart(重启调试,Ctrl+Shift+F5)和 Stop(停止,Shift+F5)。
- VARIABLES 变量视图:位于左上侧,分为
Locals(局部变量)与Globals(全局变量)。展开对象可逐级查看其内部属性和值;双击某个基础变量的数值可以直接在调试过程中原地修改该值以模拟不同分支。 - WATCH 监视窗口:点击加号图标,输入任意有效 Python 表达式(如
len(records))。随着单步推进,该表达式的值会自动实时重算并刷新。 - CALL STACK 调用堆栈:展示当前函数是从哪一行、哪一个文件层层调用进来的。点击堆栈列表中的任意上一级条目,编辑器视图和变量视图会立即切换到对应的调用上下文。
- DEBUG CONSOLE 调试控制台:程序暂停期间,可以在调试控制台底部的提示符处直接输入 Python 代码执行。它与当前暂停处的局部作用域完全打通,可直接调用当前函数内部的变量与方法进行即时验证。
四、两款工具核心调试操作与概念横向对照
为了在不同编辑器间切换时保持操作效率,下表梳理了 PyCharm 与 VS Code 在日常调试关键动作上的映射关系:
| 功能定义 | PyCharm 快捷键 (Win / Mac) | VS Code 快捷键 (Win / Mac) | 核心差异与使用注意 |
|---|---|---|---|
| 直接普通运行 | Shift+F10 / Ctrl+R |
无默认全局键(点右上角运行三角) |
PyCharm 会保留每个运行配置历史,VS Code 默认运行当前前台活动标签页 |
| 启动调试 | Shift+F9 / Ctrl+D |
F5 |
VS Code 的 F5 会读取选中的 launch.json 配置,PyCharm 默认调试当前选中的 Run Configuration |
| 单步跳过 (Step Over) | F8 |
F10 |
两者均不进入被调用的子函数;如果当前行有阻塞式 I/O,会等待 I/O 返回 |
| 单步跳入 (Step Into) | F7 |
F11 |
PyCharm 支持“Smart Step Into”(Shift+F7),在一行有多个函数嵌套调用时可选择跳入哪一个 |
| 单步跳出 (Step Out) | Shift+F8 |
Shift+F11 |
快速执行完当前函数体,返回到外层调用点 |
| 继续运行 (Resume) | F9 / ⌥⌘R |
F5 |
解除当前暂停状态,全速执行直到下一断点 |
| 即时求值 / 交互式控制台 | Alt+F8 (Evaluate Expression) |
Ctrl+Shift+Y (Debug Console) |
PyCharm 弹窗支持多行代码片段评估;VS Code 直接在底栏控制台键入交互 |
五、实战示例:利用断点与调用栈定位实际代码缺陷
下面通过一段包含数据筛选与加权均值计算的小型代码,演示在两个工具中排查逻辑缺陷的完整过程:
# sample_calc.py
def calculate_weighted_average(records):
total_score = 0
total_weight = 0
for item in records:
# 业务规则:跳过未通过审核的无效记录
if not item.get("valid", False):
continue
weight = item["weight"]
score = item["score"]
total_score += score * weight
total_weight += weight
# 此处可能存在隐患:若筛选后无有效记录,total_weight 为 0
return total_score / total_weight
def main():
test_data = [
{"name": "Task A", "score": 85, "weight": 2, "valid": False},
{"name": "Task B", "score": 90, "weight": 3, "valid": False},
]
print("开始处理数据...")
result = calculate_weighted_average(test_data)
print(f"最终加权均分: {result}")
if __name__ == "__main__":
main()
1. 故障表现与排查切入
直接运行该脚本,终端会抛出 ZeroDivisionError: division by zero 异常。此时不要盲目在每一行加 print(),采用调试器定位更为直接:
- 使用异常捕获断点(Exception Breakpoint):
- 在 PyCharm 中:点击调试面板左侧的两个重叠红点图标(View Breakpoints,快捷键 Ctrl+Shift+F8),在弹窗左侧勾选 Python Exception Breakpoint 中的
Any exception或新建ZeroDivisionError。 - 在 VS Code 中:在左侧 BREAKPOINTS 面板底部,直接勾选 Raised Exceptions 或 Uncaught Exceptions。
- 在 PyCharm 中:点击调试面板左侧的两个重叠红点图标(View Breakpoints,快捷键 Ctrl+Shift+F8),在弹窗左侧勾选 Python Exception Breakpoint 中的
- 复现问题:按调试模式启动程序,代码在执行到
return total_score / total_weight的瞬间会被调试器自动强制挂起,界面精确停留在除零这一行。 - 回溯调用栈与变量:
- 查看变量栏:发现
total_score为0,total_weight为0。 - 检查调用栈:在 Call Stack 中点击上一级
main(),变量区立刻呈现出test_data的两项数据,发现两项的valid字段均为False,导致循环内total_weight从未累加。 - 在控制台验证修复逻辑:在 PyCharm 的 Evaluate 弹窗或 VS Code 的 Debug Console 中输入
total_score / total_weight if total_weight > 0 else 0.0,确认返回0.0符合业务保底预期,从而完成代码修复。
- 查看变量栏:发现
六、常见问题诊断与排错指南
在日常使用 PyCharm 和 VS Code 运行与调试 Python 时,以下四类问题出现频率最高,可通过对应的判断依据逐一排除:
1. 断点变成空心或直接跳过不暂停
- 排查原因一:启动了 Run 而非 Debug。点击绿色三角形启动的是普通执行模式,断点会被完全忽略。请核对启动日志,如果日志第一行没有包含
pydevd(PyCharm)或debugpy(VS Code),说明当前不是调试模式。 - 排查原因二:代码根本未执行到该分支。如果断点打在某个
if分支内部或未被调用的函数内部,代码流走的是其他分支,断点自然不会被触发。可在调用该函数的外层入口行补充一个断点,验证调用链是否建立。 - 排查原因三:文件路径软链接或大小写不一致。在 macOS 或 Linux 容器环境下,如果项目目录包含符号链接(Symlink),或者工作区路径与实际文件系统中的绝对路径大小写不一致,VS Code 的 debugpy 可能会因路径比对失败而无法将源码行号映射到运行进程。解决办法是在
launch.json中显式指定正确的cwd和绝对路径。
2. ModuleNotFoundError 依赖丢失
pip list 能看到包,但点击 IDE 的运行按钮却提示找不到该包。
这是因为 IDE 使用的 Python 解释器与终端安装包的 Python 环境并非同一个。具体解决步骤:
- 在代码开头加入
import sys; print(sys.executable),运行并记下控制台打印出的具体解释器绝对路径。 - 在系统终端输入
which python(macOS/Linux)或where python(Windows),对比两个路径是否完全一致。 - 若不一致,在 IDE 解释器设置中将目标解释器切换为终端使用的虚拟环境路径,或在 IDE 内置的终端面板(已自动激活目标环境)执行
pip install [包名]。
3. 多进程或异步任务中断点未命中
当代码中使用 multiprocessing.Process、concurrent.futures.ProcessPoolExecutor 或 Celery 等派生子进程时,主进程启动的调试器默认可能无法自动附着到子进程中:
- PyCharm 配置:进入 Settings > Build, Execution, Deployment > Python Debugger,确保勾选了 Attach to subprocess(默认勾选)。
- VS Code 配置:在
.vscode/launch.json对应的配置项中,显式添加"subProcess": true,这样主进程派生子进程时,debugpy 会自动挂钩子进程并将调试信号转发至当前窗口。
4. 命令行参数与环境变量传递
当需要向脚本传入命令行参数(如 python main.py --config prod.json)时,在图形界面中的配置位置如下:
- PyCharm:点击顶部运行按钮旁的下拉菜单,选择 Edit Configurations...,在
Parameters输入框中填入--config prod.json;在Environment variables栏点击文件夹图标添加环境变量。 - VS Code:在
launch.json中直接配置args数组与env字典:"args": ["--config", "prod.json"], "env": { "APP_DEBUG": "1", "DB_PORT": "5432" }
通过规范解释器绑定、熟练运用 F 系列调试控制键,并结合条件断点与即时求值功能,可以在 PyCharm 与 VS Code 中建立高效、可控的代码调试与问题定位流程。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









