当前位置: 首页 > article >正文

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



文章目录

    • 背景与问题描述
    • 一、问题分析
    • 二、解决方案
      • 1. 修改 `launch.json` 文件,确保正确的工作目录
      • 2. 检查和调整相对路径
      • 3. 直接调试与 `launch.json` 调试的区别
        • (1)直接调试 Python 文件
        • (2)使用 `launch.json` 配置调试
    • 三、总结


在使用 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 更适合复杂项目。

http://www.kler.cn/news/363254.html

相关文章:

  • 批量合并PDF 文件的 5 大解决方案
  • proteus中没有STM32F103C8(已解决)
  • 零售行业的数字化营销转型之路
  • Data+AI━━隐私都没了,还不懂用户画像吗?
  • 【NOIP普及组】 装箱问题
  • 磁珠的工作原理:【图文讲解】
  • 天锐绿盾与Ping32内网安全保护能力对比,选择最优方案
  • 教学资源的信息化管理:Spring Boot平台
  • 如何配置 Jenkins 主从架构以及结合 Gerrit 和镜像操作
  • **KAMA指标**,用于衡量股价趋势的一个技术分析指标
  • Mockito Mock DataSourceTransactionManager失败原因
  • 二、Linux 入门教程:开启大数据领域的神奇之旅
  • 【部署篇】Haproxy-01安装部署(源码方式安装)
  • 双碳”目标下民用建筑用户侧储能的管理
  • Vue3快速入门(一)环境配置与项目创建
  • 植物健康,Spring Boot来保障
  • nginx配置网站服务
  • 蓝桥杯注意事项
  • Linux中exec系列函数与fork函数
  • NoSuchBeanDefinitionException报错
  • 硬件产品经理的开店冒险之旅(下篇)
  • AWD初步学习
  • 智能听诊器革新宠物健康监测
  • 基于Python大数据的电影天堂网数据分析及可视化系统
  • Vue 常用的狗钩子函数
  • redis和memcached的区别