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