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

news2024/10/21 5:06:45


文章目录

    • 背景与问题描述
    • 一、问题分析
    • 二、解决方案
      • 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.coloradmin.cn/o/2219809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AIGC】第一性原理下的ChatGPT提示词Prompt设计:系统信息与用户信息的深度融合

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯第一性原理与ChatGPT提示词Prompt设计应用第一性原理于ChatGPT提示词Prompt设计系统信息和用户信息的融合实际应用结论 💯系统信息与用户信息的定义和重要性系…

鸿蒙中富文本编辑与展示

富文本在鸿蒙系统如何展示和编辑的?在文章开头我们提出这个疑问,带着疑问来阅读这篇文章。 富文本用途可以展示图文混排的内容,在日常App 中非常常见,比如微博的发布与展示,朋友圈的发布与展示,都在使用富文…

C++高阶:红黑树实现

目录 一.红黑树的概念 1.1红黑树的规则 1.2红黑树的效率 二.红黑树的实现 2.1红黑树的结构 2.2红黑树的插入 2.2.1插入的大致过程 2.2.2情况一:变色 ​编辑 2.2.3情况二:单旋变色 2.2.4情况三:双旋变色 2.3插入代码实现 2.4红黑树的…

【网络安全】简单P1:通过开发者工具解锁专业版和企业版功能

未经许可,不得转载。 文章目录 前言发现过程前言 在探索一个SaaS平台的过程中,我发现了一个漏洞,使得我能够在无需订阅的情况下解锁高级(专业/企业)功能。 发现过程 我使用一个没有任何高级功能的基本用户账户进行常规登录。在浏览平台时,我注意到某些按钮和功能上带有…

【C++STL】list的基本介绍与使用方式

✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 🔥 所属专栏:C深入学习笔记 💫 欢迎来到我的学习笔记! 一、list的介绍 文档内容以及大致翻…

ROS笔记之kill掉所有ros节点rosnode

ROS笔记之kill掉所有ros节点rosnode 文章目录 ROS笔记之kill掉所有ros节点rosnode1. 杀死所有 ROS 节点(不包括 rosmaster)2. 杀死 rosmaster3. 验证所有节点和 rosmaster 是否已终止4. roscore 和 rosmaster 是同一个概念吗?5. 为什么执行 k…

【踩坑日记36】ModuleNotFoundError: No module named ‘taming‘

问题描述 ModuleNotFoundError: No module named ‘taming‘问题分析 未正确安装taming-transformers包 问题解决 从github网站中安装taming-transformers包: 从github网站中下载taming-transformers代码 git clone https://github.com/CompVis/taming-transfo…

微机原理与接口技术知识点总结——绪论

1.1、计算机发展概述 早期计算机的用途主要是用于算数,一直到20世纪电子领域基础研究的突破,也就是电子计算机的诞生,计算机才变得如此广泛。以微电子技术为基础制造的电子计算机已经完全取代了机械计算机和机电计算机,因此电子计…

第二十二届GOPS全球运维大会2024一日感

第二十二届GOPS全球运维大会将于2024年4月25-26日在南山区深圳湾万丽酒店召开。大会将为期2天,侧重大模型、AIOps、DevOps、可观测、SRE、云原生等热门技术领域。 GOPS是我一直关注的一场技术峰会,主要是它的侧重点在运维方面,这和我本身的职…

【C++干货篇】——类和对象的魅力(二)

【C干货篇】——类和对象的魅力(二) 1.类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。 ⼀个类,我们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的…

从 Microsoft 官网下载 Windows 10

方法一: 打开 Microsoft 官网: 打开开发人员工具(按 F12 或右键点击“检查”)。 点击“电脑模拟手机”按钮,即下图: 点击后重新加载此网页,即可看到下载选项。

[k8s理论知识]3.docker基础(二)隔离技术

容器其实是一种沙盒技术,其核心是通过约束和修改进程的动态表现,为其创建一个边界。这个边界确保了应用与应用之间不会相互干扰,同时可以方便在不同的环境中迁移,这是PaaS最理想的状态。 程序是代码的可执行镜像,通常…

springboot项目get请求遇到:Message Request header is too large报错。

一、错误日志 HTTP Status 400 – Bad Request Type Exception ReportMessage Request header is too largeDescription The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, inva…

Django学习-ORM_常用字段及字段选项

字段选项: 注意:当我们新增数据的时候,如果没有新增设置了default的字段,此时会使用default设置的默认值填充到新增的数据中

数字后端零基础入门系列 | Innovus零基础LAB学习Day2

今天开始更新数字IC后端设计实现中Innovus零基础Lab学习后续内容。 数字后端零基础入门系列 | Innovus零基础LAB学习Day1 ####LAB5-2 这个章节的目标也很明确——学习掌握工具的一些常用快捷键。 这里只需要掌握以下几个快捷键即可。其他小编我也不会,也用不着。…

【初识数据库】

目录 一、数据库简介 1.什么是数据库 2.数据库与数据结构有啥关系 3.为什么要使用数据库 二、数据库服务器、数据库和表的关系 三、客户端与服务器的通讯方式 1.C/S架构 2.B/S架构 3.命令提示符 4.MySQL架构 一、数据库简介 1.什么是数据库 组织和保存数据的应用程序…

【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器

前言 🌟🌟本期讲解关于TCP/UDP协议的原理理解~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不…

centors7安装docker启动ubuntu

在centors上升级glibc为2.18,使用yum最新源直接安装不行,使用源码安装还不行,因为必须使用2.18版本glic,采用先安装docker,在启动新的Ubuntu,在ubuntu里配置自己的环境 1. centors安装docker 查看docker的…

专业学习|马尔可夫链(概念、变体以及例题)

一、马尔可夫链的概念及组成 (一)学习资料分享 来源:024-一张图,但讲懂马尔可夫决策过程_哔哩哔哩_bilibili 马尔可夫链提供了一种建模随机过程的方法,具有广泛的应用。在实际问题中,通过转移概率矩阵及初…

NOIP2023题解

T1:词典 有一个好猜的结论:对于一个字符串,若它当中的最小字符大于等于某其他字符串中的最大字符,那么这个字符串一定不可行。 证明也很简单,若最小字符大于最大字符,显然一定不可行。若最小字符等于最大…