解决python import时ModuleNotFoundError异常

news2024/9/23 5:23:26

文章目录

      • 前言
    • 一 import索引机制
    • 二 ModuleNotFoundError原因及其解决办法
      • 1. 模块,包名字错误
      • 2. 模块,包未导入或未安装
      • 3. 模块,包命名冲突
      • 4. 模块,包路径不在import索引范围内(常见且重点)

前言

  在学习和使用python import xxx时,无论新手还是老手ModuleNotFoundError异常应该都是会遇到的,特别是在项目更换运行环境或者自建包的时候。本文来简单梳理下导致ModuleNotFoundError异常的一些原因以及解决办法,仅当个人笔记使用。

一 import索引机制

  想要知道导致ModuleNotFoundError的原因及其解决办法,那就得了解import 是如何进行索引的,详情见该文章:python中import的索引机制

二 ModuleNotFoundError原因及其解决办法

  导致ModuleNotFoundError的原因各种各样,下面拣一些常见的分析一下(Windows系统)。

1. 模块,包名字错误

  import xxx时xxx名字拼写错误导致ModuleNotFoundError的情况出现也比较多,当模块,包名字错误或者不存在时一般编辑器(pycharm)会以红色的下划线提示,如下
在这里插入图片描述
解决办法:查找确认模块正确名字后重新import

2. 模块,包未导入或未安装

  在copy别人的代码或者网上学习时,有时候别人贴的图或者代码只是部分,以及隐式import,这时我们copy下来运行就有可能抛ModuleNotFoundError异常。
解决办法:
1). 查看有无使用import 导入该模块或包,若没有则使用import导入
2). cmd窗口用pip list查看包是否已经安装,没有则使用pip install xxx安装
3). 检查包版本是否正确,更新包版本(pip install --upgrade xxx) 或者卸载(pip uninstall xxx)重新安装

3. 模块,包命名冲突

  如果命名不规范,要导入的XXX与已有的模块,包的命名空间冲突,这时也可能导致import异常。

4. 模块,包路径不在import索引范围内(常见且重点)

  前面的三点异常不难处理,当你有点基础后,遇到更多的是模块或包的路径不在import索引范围内引起的ModuleNotFoundError异常,这也是本次学习的重点。了解import索引机制能够更好更快的解决问题,上面给了import索引机制的文章链接,里面有详细的演示,如果不想看可以看下面的流程图,也可以一目了然。
在这里插入图片描述
从上面流程图可以看到当模块或包不是python内置的,路径也不在sys.path列表里面时,import索引就会抛ModuleNotFoundError异常。自建的模块或包不是python内置的,所以我们的解决办法就是将模块或包的路径添加到sys.path列表中

将模块或包的路径添加到sys.path中

  • 要导入的模块,包和运行脚本在同一项目
    如果要导入的XXX模块或包和运行脚本在同一个项目,那么可以用以下代码将XXX模块或包所属项目的路径添加到sys.path中,注意这里是所属项目的路径,而非模块或包的路径。如下
#根据运行脚本向上找到项目路径
path = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
#添加路径到sys.path中
#sys.path.append(path)
sys.path.insert(0, path)

在这里插入图片描述
在这里插入图片描述
需要注意的是路径添加要在import之前,如下

# -*- coding: utf-8 -*-
"""
  File Name:   CSDN
  Description :
  Author :    admin
  date:     2022/5/4
"""
import sys
import os

#添加项目路径到sys.path
path = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
sys.path.insert(0, path)
print("加了之后", sys.path)
#添加路径后再import
from ModuleAndPackage.pk1 import t1
from ModuleAndPackage.pk2 import t2

t1.t1()
t2.t2()
  • 要导入的模块,包和运行脚本不在同一项目
      如果要引用的模块,包和运行的脚本不在同一个项目,即引用项目之外的包或模块,那么上面方法就不在适用了。不过我们的宗旨还是要把被引用的包或模块的路径添加到sys.path中。从上面的import索引流程图中可以看出,还有三种方法可以将路径添加到sys.path中,如下

1). 通过环境变量PYTONPATH添加到sys.path
在这里插入图片描述

2). 通过.pth文件添加到sys.path
在这里插入图片描述
使用该方法时要注意:.pth文件要放在python安装目录下的site-package文件下,一行就代表一个路径
在这里插入图片描述

3). 直接将被引用的模块或包放在第三方模块site-packages下
在这里插入图片描述
如果被引用的包或模块是公用的,推荐使用该方法,该方法直接把被引用的模块或包放在第三方模块site-packages下,不需要再做额外的操作。

  以上就是解决import时ModuleNotFoundError异常的一些方法,可以根据实际问题环境选择不同的解决方法。

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

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

相关文章

“改进型”Howland 电流泵电路

“改进型”Howland 电流泵电路 “改进型”Howland 电流泵是一种使用差分放大器在分流电阻器 (Rs) 上施加电压的电路,从而产生能够驱动大范 围负载电阻的双极性(拉电流或灌电流)压控电流源。 设计注释 确保运算放大器的输入端(V…

Spring应用如何打印access日志和out日志(用于分析请求总共在服务耗费多长时间)

我们经常会被问到这样一个问题。你接口返回的好慢呀,能不能提升一下接口响应时间啊?这个时候我们就需要去分析,为什么慢,慢在哪。而这首先应该做的就是确定接口返回时间过长确实是在服务内消耗的时间。而不是我们将请求发给网关或…

STM32高级篇—按键FIFO

想成问一名非常优秀的嵌入式软件工程师,是需要掌握很多知识的。 完成STM32的基础内容的学习后,我们也进入到学习STM32高级的内容上。 本人也是一名嵌入式的初级入坑人,写的内容可能会有错误,或者不正确的地方也请大家多多指教&…

1.0 Android中Activity的基础知识

一:Activity的定义 Activity是一个应用组件,它提供了一个用户界面,允许用户执行一个单一的、明确的操作,用户看的见的操作都是在activity中执行的。Activity的实现需要在manifest中进行定义,不让会造成程序报错。 1.…

【动态规划】| 路径问题之不同路径 力扣62

🎗️ 主页:小夜时雨 🎗️ 专栏:动态规划 🎗️ 如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/unique-paths/description/ 通常动态规划的题目有…

【Linux】解决由于 network和 NetworkManager不兼容,导致的网络服务错误

今天尝试启动在虚拟机中启动一些中间件环境(用docker管理),使用ssh连接虚拟机,却始终无法连接 我怀疑是不是虚拟机的ip地址改变了,但是之前我的虚拟机ip已经在 /etc/sysconfig/network-scripts 目录下,创…

PCA与LDA

共同点 降维方法: PCA和LDA都是数据降维的方式,它们都能通过某种变换将原始高维数据投影到低维空间。 数学原理: 两者在降维过程中都使用了矩阵特征分解的思想,通过对数据的协方差矩阵或类间、类内散度矩阵进行特征分解&#xff…

Vue项目实践:使用滚动下拉分页优化大数据展示页面【通过防抖加标志位进行方案优化】

Vue项目实践:使用滚动下拉分页优化大数据展示页面 前言 传统的分页机制通过点击页码来加载更多内容,虽然直观,但在处理大量数据时可能会导致用户体验不佳。相比之下,滚动下拉分页能够在用户滚动到页面底部时自动加载更多内容&…

实现JWT认证与授权的Spring Boot项目详解

我们将详细介绍如何使用JWT(JSON Web Tokens)结合Spring Boot框架实现用户认证和授权系统。此方案将包括用户注册、登录以及通过JWT令牌进行后续请求的身份验证过程。我们将从引入必要的依赖开始,然后逐步构建项目的各个部分,包括…

如何查看当前的gruop_id 的kafka 消费情况 这个可以查看到是否存在消费阻塞问题

如何查看当前的gruop_id 的kafka 消费情况 这个可以查看到是否存在消费阻塞问题 命令如下: /kafka/bin/kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --group GWW --describe 其中 127.0.0.1 为zookeeper 服务器ip GWW 为对应要查看的group_id 如下…

从零到一建设数据中台(番外篇)- 数据中台UI欣赏

番外篇 - 数据中台 UI 欣赏 话不多说,直接上图。 数据目录的重要性: 数据目录是一种关键的信息管理工具,它为组织提供了一个全面的、集中化的数据资产视图。 它不仅记录了数据的存储位置,还详细描述了数据的结构、内容、来源、使…

800W-2300W-4500W-7000W线绕电阻器的选型参考

EAK线绕电阻器将普通电阻器材料的高脉冲稳定性与优化的导热和高度保护相结合。安装在导热表面上可进一步改善散热并提高稳定性。 EAK提供各种外壳设计和材料(如铝和钢)的导线电阻器。它们符合 UL508 的要求,在用作制动、充电、放电或加热电阻…

Java面试八股之静态变量和实例变量的区别有哪些

Java静态变量和实例变量的区别有哪些 存储位置和生命周期: 静态变量:静态变量属于类级别,存储在Java的方法区(或称为类区,随JVM实现而异,现代JVM中通常在元数据区内),并且在类首次…

Rocky Linux 9.4 部署Zabbix 7.0

文章目录 Zabbix基本概念zabbix介绍zabbix特性zabbix结构 安装Zabbix主机名配置配置Zabbix-Server(1)禁用EPEL提供的Zabbix软件包(2)安装Zabbix Server、Web前端、Agent(3)创建初始数据库(4)Zabbix server配置数据库(5)为Zabbix前端配置PHP(6)启动Zabbix server和agent进程(7)放…

Windows电脑清理C盘内存空间

ps:过程截图放在篇末 一、%tmp%文件 win R键呼出运行窗口,输入 %tmp% 自动进入tmp文件夹,ctrl A全选删除 遇到权限不足,正在运行,丢失的文件直接跳过即可 二、AppData文件夹 1、pipcache 在下列路径下面&…

Amortized bootstrapping via Automorphisms

参考文献: [MS18] Micciancio D, Sorrell J. Ring packing and amortized FHEW bootstrapping. ICALP 2018: 100:1-100:14.[GPV23] Guimares A, Pereira H V L, Van Leeuwen B. Amortized bootstrapping revisited: Simpler, asymptotically-faster, implemented. …

代理设计模式之JDK动态代理CGLIB动态代理原理与源码剖析

代理设计模式 代理模式(Proxy),为其它对象提供一种代理以控制对这个对象的访问。如下图 从上面的类图可以看出,通过代理模式,客户端访问接口时的实例实际上是Proxy对象,Proxy对象持有RealSubject的引用,这样一来Proxy在可以在实际执行RealSubject前后做一些操作,相当于…

MTK烧录USB驱动下载

下载链接 https://www.catalog.update.microsoft.com/Search.aspx?qMediaTek%20USB%20Port 驱动安装教程 https://miuiver.com/install-official-mediatek-driver/

中科数安 |-公司办公透明加密系统,数据防泄漏软件

#数据防泄漏软件# 中科数安是一家专注于提供企业级数据防泄漏解决方案的公司,其办公透明加密系统是专为保护企业内部核心数据资料设计的。 PC地址:——www.weaem.com 该系统通过以下主要功能模块实现高效的安全防护: 文档透明加密&#xff1…

惠州惠城:可燃气体报警器定期校准检测,安全更放心

在惠州惠城这片繁华的土地上,工业发展日新月异,安全问题愈发受到重视。其中,可燃气体报警器作为预防火灾和爆炸事故的重要设备,正在越来越多的场所得到应用。 今天,佰德就来探讨一下可燃气体报警器在惠州惠城的重要性…