为了解析导入的模块,Python 检查内置库、安装的模块和当前项目中的模块等位置。如果无法解析该模块,则会抛出ModuleNotFoundError

以下的几种情况会出现ModuleNotFoundError及解决方法:

1.module包没安装
# XXX为module名
pip3 install XXX #从服务器设定源中搜索安装
pip3 install XXX -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ #从清华的源中搜索安装
2.忘了import

module安装了但是在python文件中没有import

ABC.py
#! /usr/bin/env python3

import requests
import json
import yaml
import paramiko
import time
3.module拼写错误

安装或者在.py文件中导入时module名拼写错误,如大小写有误、字母有误、module包名有误

4.自建module没有__init__.py文件

在本module下的所有文件建立一个索引放在当前路径下的__init__.py文件。如果一个文件夹下没有__init__.py文件,不会被当做一个module

对于缺少__init__.py文件这种情况,还有一种报错形式是:

ImportError: attempted relative import with no known parent package

解决:检查一下待导入的包的根目录是否存在一个__init__.py文件,没有的话建一个空的__init__.py文件即可(注意:不光要检查待导入的包根目录是否存在__init__.py文件,还需要检查当前程序所在文件夹是否存在这个文件)。

5.安装的第三方module包的版本不对

以上三种情况排查玩可能是module包版本不对。需要先卸载原来pip 安装的包,然后安装一个指定版本的包。比如python3不兼容 2.0版本及以上的DBUitls包,需要安装1.x的版本才行。

pip uninstall DBUtils
pip install DBUtils==1.3
6.自定义的包名与安装的包名相同,导致import包的时候导错了包

这种情况不经常发生,但是一旦发生,非常难找到原因。以上方法试过后不妨检查一下自己自建module是否和第三方module包重名。

7.没设置PYTHONPATH或者

有的人可能会说为什么别人也没设置这个环境变量,为啥他就能顺利执行,我就不行。这么说吧,每个人的电脑的开发环境不一样,开发环境这种东西永远带有点玄学的意味,所以。。。

#尝试再次安装确保module包已安装,以DBUtils为例
% pip install DBUtils==1.3
//⚠️提示 Requirement already satisfied: DBUtils==1.3 in ./venv/lib/python3.9/site-packages (1.3)
# 声明环境变量,注意路径要和安装module包后提示路径一致
% export PYTHONPATH=./venv/lib/python3.9/site-packages:$PYTHONPATH
#若还不行,查看pip路径,也加入环境变量中
% pip -V
pip 21.1.3 from /Users/lch/python_project/learn_python/venv/lib/python3.9/site-packages/pip (python 3.9)
export PYTHONPATH= /Users/lch/python_project/learn_python/venv/lib/python3.9/site-packages:$PYTHONPATH
8.自建的module包所在路径不在PYTHONPATH下

举🌰:

目录结构如下
├──README.md
├──__init__.py
├──conf
│ ├── __init__.py
│ ├── offline_conf.py #本地运行配置文件
│ └── online_conf.py #线上运行配置文件
└──server #启动服务文件夹
├── __init__.py
└── ABC.py
ABC.py
#! /usr/bin/env python3

import requests
import json
# 把当前文件所在文件夹的父文件夹路径加入到PYTHONPATH
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from conf.online_conf import *

os.path.abspath(file)获取到的是ABC.py的绝对路径;os.path.dirname(os.path.abspath(file))获取到的是ABC.py所在文件夹的也就是server的根路径
os.path.dirname(os.path.dirname(os.path.abspath(file)))获取到的是server所在文件夹也就是learn_python的根路径。
至此就获取到了learn_pyhton的根路径,使用sys.append()命令把路径添加到环境变量中即可。


解决方法各有不同,建议挨个尝试。心有猛虎,细嗅蔷薇,希望能帮到大家~