从根本上优雅地解决 VSCode 中的 Python 模块导入问题

整体概述:
在我尝试运行 test_deal_file.py 时,我遇到了一个 ModuleNotFoundError 错误,Python告诉我找不到名为 controllers 的模块。这意味着我无法从 deal_file.py 中导入 read_excel 函数。

为了解决这个问题,我尝试了几种方法。
首先,我使用了相对导入,这在不改变当前工作目录的情况下是有效的,但一旦我切换了目录,这个方法就不行了。
接着,我尝试动态地将当前工作目录添加到 sys.path 中。
这样做虽然有效,但我觉得这种方法不够优雅。

所以,我决定采取一种更彻底的解决方案。
我通过修改 VSCode 的 settings.json 文件,设置了 PYTHONPATH 环境变量,确保了我的项目路径 my_project 被加入到模块搜索路径中。
我在settings.json中为不同的操作系统配置了terminal.integrated.env` 部分,然后重启了虚拟环境和集成终端。重新运行我的文件后,问题终于解决了。

通过这篇文章,我想和大家分享如何以一种更优雅的方式解决 Python 项目中的模块导入问题。
同时,我也介绍了如何在 VSCode 中管理项目环境变量和运行路径,这对于解决开发过程中的环境配置问题非常有帮助。希望我的经验能成为其他开发者在面对类似问题时的宝贵资源。

我的问题解决过程

(想直接看解决教程的直接跳到下一个标题内容)
我的项目结构是这样的

my_project/
├── controllers/
│   ├── __init__.py     
│   └── deal_file.py     
└── tests/├── __init__.py      └── test_deal_file.py 

结果运行test_deal_file.py会出现报错信息:

# 报错信息from controllers.deal_file import read_excel
ModuleNotFoundError: No module named 'controllers'

我尝试了引用改成from ..controllers.deal_file import read_excel,terminal不切换目录可以运行成功,但切换目录后还是运行失败


我又尝试了

import sys
import os
sys.path.append(os.getcwd())

但是说实话,不是很美观


我决定从根本上解决这个问题。

首先我打印我所有运行路径

import sys
paths = sys.path
for path in paths:print(path)

输出结果果然,不包含我my_project的路径。如何把my_project路径添加到系统运行路径呢?方法如下:


vscode 解决模块导入问题的流程

1. 打开设置界面
在 VSCode 中,您可以通过点击左下角的齿轮图标然后选择 “Settings” 来打开设置界面。
另一种方式是使用快捷键 Ctrl + ,(在 Mac 上是 Cmd + ,)直接打开设置界面。在这里插入图片描述
2. 选择合适的工作区
打开setting界面后,上面有三个选项,对应着三种级别的设置文件工作区(workspace)、远程(remote)和用户(user)。每个级别的设置都有其特定的用途和作用范围。

用户设置(User settings): 位于全局级别,适用于您计算机上的所有 VSCode 实例。 路径通常在
~/.config/Code/User/settings.json(Unix/Linux)或
%APPDATA%\Code\User\settings.json(Windows)。 用于存储您希望在所有项目和环境中使用的全局配置。
工作区设置(Workspace settings): 特定于当前打开的工作区或项目。 路径通常在工作区根目录下的 .vscode/settings.json 文件中。 用于存储针对特定项目或工作区的配置,这些配置不会影响其他项目。
远程设置(Remote settings): 特定于远程开发环境,例如通过 SSH 或容器连接的远程服务器。 路径通常在 .vscode-remote/settings.json 文件中,这个文件位于您的本地工作区目录下。 用于存储针对远程开发环境的配置,如
SSH 连接设置、容器设置等。

现在你需要选择适合你的设置文件:
如果环境变量仅适用于特定项目,您应该在工作区设置文件中添加它们。
如果环境变量需要在所有项目中使用,您应该在用户设置文件中添加它们。
如果环境变量是针对远程开发环境的,您应该在远程设置文件中添加它们。
在这里插入图片描述

3. 打开对应工作区的setting.json页面
往下滑找到Edit in setting.json,点击打开
在这里插入图片描述
4. 编辑setting.json
接下来你要修改这个文件
在这里插入图片描述
下面内容复制到你的setting.json文件中,并保存

{"terminal.integrated.env.windows": {"PYTHONPATH": "/path/to/your/project"},"terminal.integrated.env.linux": {"PYTHONPATH": "/path/to/your/project"},"terminal.integrated.env.osx": {"PYTHONPATH": "/path/to/your/project"}
}

在这里插入图片描述

  1. 重启虚拟环境
    Unix/Linux 系统:source /path/to/venv/bin/activate
    Windows 系统:\path\to\venv\Scripts\activate
    在这里插入图片描述

  2. 关闭terminal集成终端
    在 VSCode 中,关闭当前打开的集成终端。
    在这里插入图片描述

  3. 打开新的集成终端:
    通过点击 VSCode 顶部的 “Terminal” 菜单或者使用快捷键 Ctrl+ (在 Mac 上是Cmd+ ) 来打开一个新的集成终端窗口。
    在这里插入图片描述

  4. 重新运行你的文件
    可以看到你的项目路径已经添加到环境,项目也可以正常运行了👌
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/775477.shtml

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

相关文章

【ML】类神经网络训练不起来怎么办 5

【ML】类神经网络训练不起来怎么办 5 1. Saddle Point V.S. Local Minima(局部最小值 与 鞍点)2. Tips for training: Batch and Momentum(批次与 动量)2.1 Tips for training: Batch and Momentum2.2 参考文献:2.3 Gradient Descent2.4 Concluding Remarks(前面三讲)3.…

【QT】:基本框架

基本框架 一.创建程序二.初识函数1.main2.Widget.h3.Wight.cpp4.Wight.ui5.文件名.pro 三.生成的中间文件 本系列的Qt均使用Qt Creator进行程序编写。 一.创建程序 二.初识函数 1.main 2.Widget.h 3.Wight.cpp 4.Wight.ui 此时再点击编辑,就看到了ui文件的本体了。…

Django query

QuerySet API 参考 该文档描述了 QuerySet API 的细节。它是建立在 模型 和 数据库查询 指南的材料基础上的,因此,在阅读这篇文档之前,你可能需要阅读和理解这些文档。 在整个参考资料中,我们将使用在 数据库查询指南 中提出的 示…

数仓建设实践——58用户画像数仓建设

目录 一、数据仓库&用户画像简介 1.1 数据仓库简介 1.2 数据仓库的价值 1.3 用户画像简介 1.4 用户画像—标签体系 二、用户画像数仓建设过程 2.1 画像数仓—背景&现状 2.2 画像数仓—整体架构 2.3 画像数仓—研发流程 2.4 画像数仓—指标定义 2.5 画像数仓…

【有芯职说】数字IC前端工程师

数字IC前端设计 一、概述 数字IC前端设计,作为数字IC芯片设计流程的关键一环,是数字IC设计类岗位的重要组成部分。随着芯片规模的不断扩大与业务范围的增加,特别是在国产自主化潮流的推动下,该岗位的需求日益增长,经验丰富的工程师更是炙手可热。 数字IC前端设计主要包含…

RabbitMQ相关总结

Broker 异步调用中用Broker进行事件订阅和调用,完成解耦 没有强依赖,不用担心级联失败 流量削峰 MQ 的下载 1.可以使用命令拉取镜像 docker pull rabbitmq:3-management 2.也可以直接去官网下载tar包,然后上传到虚拟机上面 spring AMQP…

35岁程序员的经历和看法

35岁程序员的人生感悟:岁月见证的成长与转变 在程序员的世界里,35岁往往被视为一个重要的节点。对于许多人来说,这个年纪意味着成熟、稳定和经验的积累。作为一名35岁的程序员,我想分享一下自己的经历和看法。 回顾自己的职业生涯…

【数据库管理操作】Mysql 创建学生数据库及对数据表进行修改

MySQL 创建学生成绩数据库 1.创建数据库 create database studentscore;创建完成之后,如果需要使用该数据,使用use命令 use studentscore;创建表前查看当前数据库中包含的表 show tables; 2.创建bclass表 create table bclass( class_id char(8) …

程序员 35 真的会失业吗

35 岁被认为是程序员职业生涯的一个重要节点,引发了许多人对职业发展受限的担忧。一些人担心随着年龄的增长,难以跟上技术更新的步伐;而另一些人则坚信丰富的经验和深厚的技术积累是无法替代的财富。 然而,我认为 35 岁并非是程序…

Sublime 彻底解决中文乱码

1. 按ctrl,打开Console,输入如下代码: import urllib.request,os; pf Package Control.sublime-package; ipp sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHand…

ubuntu之搭建samba文件服务器

1. 在服务器端安装samba程序 sudo apt-get install samba sudo apt-get install smbclient 2.配置samba服务 sudo gedit /etc/samba/smb.conf 在文件末尾追加入以下配置 [develop_share] valid users ancy path /home/ancy public yes writable y…

国内ip切换app,让切换ip变得简单

在数字化快速发展的今天,互联网已经成为我们生活中不可或缺的一部分。然而,随着网络应用的深入,用户对于网络环境的需求也日益多样化。其中,IP地址作为网络中的关键标识,其切换与管理显得尤为重要。为了满足用户对于IP…

每日一题 --- 链表相交[力扣][Go]

链表相交 题目:面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交**:** 题目数据 保证 整个链式结…

【C语言】Infiniband驱动init_dev_assign函数

一、注释 一个内核模块的初始化函数,用于分配和初始化某些资源。以下是对代码块的逐行中文注释: // 定义一个初始化设备分配的函数 static void init_dev_assign(void) {int i 1;spin_lock_init(&dev_num_str_lock); // 初始化自旋锁if (mlx4_fil…

OpenCV图像滤波、边缘检测

OpenCV图像滤波 一、引言 在数字图像处理中,滤波是一种重要的技术,用于消除图像中的噪声、改善图像质量或提取特定信息。OpenCV(开源计算机视觉库)提供了丰富的滤波函数,可以方便地对图像进行各种滤波操作。本文将介…

SQLAlchemy中常用的查询方法[示例学习]

SQLAlchemy 是一个强大的 Python ORM(对象关系映射)工具,它提供了多种方法来执行数据库查询操作。以下是 SQLAlchemy 中常用的查询方法的总结: session.query():使用 session.query(Model) 来创建一个查询对象&#xf…

Swift xcode app自动化

在本文中,我将教您如何使用Swift和Xcode进行应用程序自动化。如果您是一名经验丰富的开发者,我将引导您如何帮助一位刚入行的小白实现这一目标。我们将按照以下步骤进行操作: 创建一个新的Xcode项目 配置自动化测试目标 编写测试用例 运行自…

R: 网状Meta分析进行模型构建及图形绘制

网状meta分析的制作步骤主要包括: 1. 绘制网状证据图 2. 普通Meta分析(两两之间的直接比较) 3. 网状Meta分析(整合直接比较和间接比较的结果,绘制相关图形) 4. 绘制累积概率排序图 5. 三个假设的检验…

江协STM32:点亮第一个LED灯和流水灯

很多单片机都是高电平弱驱动,低电平强驱动,所以这里是低电平有效 点亮一个LED灯 操作STM32的GPIO需要三个操作: 第一个使用RCC开启GPIO的时钟 第二步使用GPIO_Init函数初始化GPIO 第三步使用输出或输入函数控制GPIO 1.使用RCC开启GPIO的时…

游戏开发笔记:游戏海外版本时区问题(解释时区问题,分解为js写法和lua写法来分析记录,整理出对应语言的相关函数方法。)

对于海外游戏而言,与时间相关的功能,都不能忽略时区的计算。根据 ‘ 服务端资源是有限的,客户端资源是无穷无尽的 ’的定义来说,基本上时区包括时间的计算都是由客户端来进行计算,今天内容也是围绕客户端来展开。 时区算法常见的时间描述时区需要计算的点在lua语言中的写…