解决 VSCode 调试时 Python 文件路径问题及 `FileNotFoundError` 报错 (在原本非调试情况下可运行)




在使用 VSCode 进行 Python 开发时,很多开发者都会遇到一个常见的问题:在调试模式下,程序无法读取文件或路径,导致 FileNotFoundError 错误。然而,当不使用调试模式而是直接运行 Python 文件时,一切又正常工作。本文将详细探讨这个问题,并给出解决方法。

背景与问题描述

假设我们有一个项目,位于路径 /home/iip/tp/022-MLog,其目录结构如下:

022-MLog/
│
├── data/
│   └── BGL/
│       └── events_semantic.json  # 项目依赖的文件
├── demo/
│   └── mog_lstm_cnn_BGL.py       # 需要调试的 Python 脚本
├── Model/
│   └── dataset/
│       └── sample.py             # 读取文件的模块
│   └── tools/
│       └── train.py              # 调用 sample.py 的代码
└── .vscode/
    └── launch.json               # VSCode 调试配置文件

在调试时,demo/mog_lstm_cnn_BGL.py 会调用 Model/dataset/sample.py 读取文件 ../data/BGL/events_semantic.json,但调试时抛出了以下错误:

发生异常: FileNotFoundError
[Errno 2] No such file or directory: '../data/BGL/events_semantic.json'

错误提示文件路径有问题。令人疑惑的是,直接运行 demo/mog_lstm_cnn_BGL.py 没有任何问题,程序能够正常运行。

一、问题分析

这是一个典型的工作目录问题。在 Python 中,相对路径是基于当前工作目录解析的,而 VSCode 调试和直接运行程序时的工作目录可能不同。

  • 直接运行 demo/mog_lstm_cnn_BGL.py 时,工作目录通常是你所在的终端目录。
  • 调试模式下,VSCode 默认的工作目录可能是项目根目录 /home/iip/tp/022-MLog.vscode 所在的目录。因此,相对路径 ../data/BGL/events_semantic.json 在调试时无法找到。

二、解决方案

1. 修改 launch.json 文件,确保正确的工作目录

VSCode 使用 launch.json 文件来配置调试时的行为。我们可以通过指定工作目录来解决路径问题。

首先,确保 launch.json 文件位于 .vscode/launch.json 下,如果没有该文件,可以在 VSCode 侧边栏的“运行和调试”面板中点击“创建 launch.json 文件”按钮。

编辑 launch.json,将工作目录 cwd 设置为 demo 文件夹,这样调试时的工作目录与直接运行时一致。配置如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Debug",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/demo/mog_lstm_cnn_BGL.py",  // 你的主程序文件
            "cwd": "${workspaceFolder}/demo",  // 将工作目录设置为 demo 文件夹
            "console": "integratedTerminal",
            "justMyCode": true
        }
    ]
}

这样,调试时的工作目录将与实际运行时保持一致,从而解决了路径问题。

2. 检查和调整相对路径

在代码中,使用相对路径时应该确保其相对于当前的工作目录。在上面的报错示例中,路径 ../data/BGL/events_semantic.json 是相对于某个目录的。但如果你不确定当前工作目录是什么,可能会导致路径解析错误。

为了使路径更加健壮,可以使用 os.path 模块动态构建文件路径,避免路径依赖于工作目录的变化:

import os

# 获取当前文件所在的目录
current_dir = os.path.dirname(os.path.abspath(__file__))
data_dir = os.path.join(current_dir, '../data/BGL/')
file_path = os.path.join(data_dir, 'events_semantic.json')

with open(file_path, 'r') as load_f:
    # 读取文件的逻辑

os.path.dirname(__file__) 可以获取当前 Python 文件所在的目录,无论工作目录如何变化,都能构建出正确的文件路径。

3. 直接调试与 launch.json 调试的区别

了解了路径问题的原因后,我们再来分析一下 VSCode 中两种常见的调试方式:

(1)直接调试 Python 文件

这是最简单的调试方式,无需额外配置。在 VSCode 中直接打开 Python 文件,设置断点,按 F5 或点击 “运行和调试” 按钮即可开始调试。

特点:

  • 适用于简单项目或单个文件,不需要配置环境变量、命令行参数等。
  • 工作目录通常是当前工作空间或项目根目录。
(2)使用 launch.json 配置调试

当项目结构复杂,或需要传递命令行参数、环境变量时,可以使用 launch.json 进行调试配置。

特点:

  • 适用于复杂项目,可以指定工作目录、环境变量、传递参数等。
  • 可以复用调试配置,灵活性更高。

常见的 launch.json 配置项包括:

  • program:指定要调试的 Python 文件。
  • cwd:指定调试时的工作目录。
  • args:传递命令行参数。
  • env:指定调试时的环境变量。

三、总结

VSCode 在调试 Python 项目时,工作目录不一致可能导致文件路径问题,尤其是当代码中使用相对路径时。这种问题可以通过调整工作目录或使用绝对路径来解决。具体步骤包括:

  1. 设置正确的工作目录:在 launch.json 文件中通过 cwd 配置指定正确的工作目录。
  2. 动态构建文件路径:使用 os.path 模块确保路径的健壮性,避免相对路径带来的问题。
  3. 理解调试方式的差异:根据项目的复杂程度选择合适的调试方式,直接调试适用于简单场景,而 launch.json 更适合复杂项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值