解决 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.mzph.cn/diannao/57032.shtml

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

相关文章

Vulnhub打靶-matrix-breakout-2-morpheus

基本信息 靶机下载:https://pan.baidu.com/s/1kz6ei5hNomFK44p1QT0xzQ?pwdy5qh 提取码: y5qh 攻击机器:192.168.20.128(Windows操作系统) 靶机:192.168.20.0/24 目标:获取2个flagroot权限 具体流程 …

前端 js 处理一个数组 展示成层级下拉样式

好记性不如赖笔头; 前端开发中,不管是什么时候都会遇到select 下拉框的使用,一般情况下,数据处理后端都会处理好。前端一般使用相应技术栈所推荐的公共组件就可以了。 但是一般也有后端不处理的数组,需要前端自己处理成…

【热门主题】000007 网络安全:守护数字世界的坚固防线

前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热门主题】000007 网络安全:守护数字世界的坚固防线一、网…

精准赋能,助力成长 | 亲笔签数字科技“笔迹大计”第一期培训圆满收官

创新驱动,合作共赢。近日,亲笔签数字科技成功举办第一期“笔迹大计”专业培训,为新入职渠道管理员工和新签约渠道伙伴精准赋能,进一步提升业务能力水平。 精心筹备,全面覆盖 本期“笔迹大计”培训内容全面&#xff0c…

当LangGraph遇上Mem0:如何让你的AI Agent具有更智能的记忆与个性化的体验?

AI Agent(智能体)的记忆(Memory)被认为是一项必备的基础能力,它用来提取、存储会话中的重要信息并用于后续的检索与使用。可以把记忆简单地分成短期记忆与长期记忆两种,用来“记住”不同类型的信息&#xf…

Navicat连接openGauss数据库详细指南

文章目录 环境准备总体的技术路线root权限下,防火墙的关闭切换用户修改文件修改文件pg_hba.conf修改文件postgresql.conf重启数据库 创建用于连接的数据库和数据库用户使用Navicat连接 资料参考 环境准备 自行安装Navicat连接工具(自己找破解版)已经安装好openGaus…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款购物类智能体的开发,来体验一下我的智能体『科技君Tom』

目录 1.1、智能体运行效果1.2、创作灵感来源智能体平台拥有个人化且人性化的大致框架,可以让小白也能搭建出一个智能体其次是拥有丰富的插件,可以更加快速的得到自己想要的效果~ 1.3、如何制作智能体常见问题与解决方案关于人设与回复逻辑插件使用模型的…

【Linux内核】eBPF基础篇

系列综述: 💞目的:本系列是个人整理为了学习ebpf机制的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于–知乎ebpf专栏文章–进行的,每个知识点的修正和深…

python获取当前鼠标位置的RGB值

效果 依赖 pip install Pillow pyautoguisudo apt install gnome-screenshot代码 import pyautogui import timedef get_rgb_at_mouse():try:while True:# 获取当前鼠标的位置x, y pyautogui.position()# 截取当前屏幕图像screenshot pyautogui.screenshot()# 获取鼠标位置…

小O睡眠省电调研

摘要 AI 预测睡眠 断网 杀应用为主的策略 UI 睡眠识别 AI 识别 将亮灭屏、音频、上传下载、运动状态数据存到xml中,供预测分析 睡眠策略 OPPO 睡眠省电 1. sOSysNetControlManagerNewInstance:断网(wifi\mobiledata)2. S…

【D3.js in Action 3 精译_036】4.1 DIY 实战:在 Observable 平台实现 D3折线图坐标轴的绘制

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

百度统计提示:为了满足法律法规最新规定和要求,您的网站由于存在合规风险将被暂停使用百度统计服务

今天打开百度统计后看到提示: 为了满足法律法规及政府监管的最新规定和要求,保护广大网民的合法权益,您的网站由于存在合规风险将被暂停使用百度统计服务。 请您在10日内完成整改,否则将删除违规站点及数据,有问题可发…

使用dotnet-counters和dotnet-dump 分析.NET Core 项目内存占用问题

在.NET Core 项目部署后,我们往往会遇到内存占用越来越高的问题,但是由于项目部署在Linux上,因此无法使用VS的远程调试工具来排查内存占用问题。那么这篇文章我们大家一起来学习一下如何排查内存占用问题。 首先,我们来看一下应用…

手机数据恢复技巧:适用于手机的恢复应用程序

发现自己意外删除了 Android 设备上的照片,这让人很痛苦。这些照片可能是值得纪念的文件,会让您想起一些难忘的回忆。删除它们后,您知道如何恢复它们。在这种情况下,您需要使用 Android 的照片恢复应用程序。 无论您需要直接从 A…

【控制系统】深入理解反步控制(Backstepping) | 反步法控制器原理与应用实例解析(附Matlab/Simulink仿真实现)

💯 欢迎光临清流君的博客小天地,这里是我分享技术与心得的温馨角落 💯 🔥 个人主页:【清流君】🔥 📚 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 📚 🌟始终保持好奇心&…

使用Airtest自动化某云音乐爬取歌曲名称

简介 本文将介绍如何使用Airtest自动化工具来模拟用户操作,从某云音乐中爬取与特定关键词相关的歌曲名称。我们将以搜索“文字”相关的歌曲为例,并将结果保存到本地文件。 准备工作 安装Airtest并配置好Android设备或模拟器。确保你的设备上已安装某云…

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】 导语 在Java高级编程的世界里,设计模式是每个开发者必须掌握的利器。但是,如何快速理解并灵活运用这些模式呢?让我们一起探索如何借助AI编程助手Cursor,轻松掌握设计模式,提升Java编程技能! 正文 设计模式:J…

QUIC(Quick UDP Internet Connections)与 RTMP(Real Time Messaging Protocol)

QUIC(Quick UDP Internet Connections)和 RTMP(Real Time Messaging Protocol)是两种不同的网络传输协议,它们在一些方面有不同的特点和应用场景。 QUIC 协议 特点 基于 UDP:QUIC 建立在 UDP 之上&#xff…

探索 Jupyter 核心:nbformat 库的神秘力量

文章目录 探索 Jupyter 核心:nbformat 库的神秘力量1. 背景介绍:为何选择 nbformat?2. nbformat 是什么?3. 如何安装 nbformat?4. 简单的库函数使用方法4.1 读取 Notebook 文件4.2 修改 Notebook 中的单元格4.3 添加 M…

灵当CRM index.php 任意文件上传漏洞复现

0x01 产品描述: 灵当CRM是一款专为中小企业量身定制的智能客户关系管理工具,由上海灵当信息科技有限公司开发和运营。该系统广泛应用于多个行业,包括金融、教育、医疗、IT服务及房地产等领域,旨在满足企业对客户个性化管理的需求&…