解决python import时ModuleNotFoundError异常

文章目录

  • 前言
  • 一 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异常的一些方法,可以根据实际问题环境选择不同的解决方法。

    作者:搬砖,攒路费

    物联沃分享整理
    物联沃-IOTWORD物联网 » 解决python import时ModuleNotFoundError异常

    发表回复