python模块导入出现ModuleNotFoundError: No module named ‘XXX‘的问题终极办法
想要解决上面的问题,我们需要明确import导入本质,才好从根上去解决问题。
import导入本质
通常情况下,当使用 import 语句导入模块后,Python 会按照以下顺序查找指定的模块文件:
- 在当前目录,即当前执行的程序文件所在目录下查找;
- 到 PYTHONPATH(环境变量)下的每个目录中查找;
- 到 Python 默认的安装目录下查找。
以上所有涉及到的目录,都保存在标准模块 sys 的 sys.path 变量中,通过此变量我们可以看到指定程序文件支持查找的所有目录。换句话说,如果要导入的模块没有存储在 sys.path 显示的目录中,那么导入该模块并运行程序时,Python 解释器就会抛出 ModuleNotFoundError(未找到模块)异常。
解决方式
针对于上述三种查找模块的方式,对应的给出三种解决方案:
- 向 sys.path 中临时添加模块文件存储位置的完整路径;
- 将模块放在 sys.path 变量中已包含的模块加载路径中;
- 设置 path 系统环境变量。
方案一: 临时添加模块完整路径
模块文件的存储位置,可以临时添加到 sys.path 变量中。例如想要在D:\XXX\autoCMS_Interface\test_moudle\module2.py模块下导入D:\XXX\PyCMSDY\test_config的module3.py文件,注意module2.py和module3.py分别处于另个不同项目中。
sys.path.append(r"D:\XXX\PyCMSDY\test_config")
import module3
print(module3.name)
执行sys.path可以看出"D:\XXX\PyCMSDY\test_config"已经添加到path路径下。
需要注意的是,通过该方法添加的目录,只能在执行当前文件的窗口中有效,窗口关闭后即失效。
方案二:将模块保存到指定位置
Python 程序默认的模块加载路径保存在 sys.path 变量中,通常来说,我们默认将 Python 的扩展模块添加在 lib\site-packages 路径下,它专门用于存放 Python 的扩展模块和包。
所以,我们可以直接将我们已编写好的 module3.py 文件添加到 lib\site-packages 路径下,就相当于为 Python 扩展了一个 module3模块,这样任何 Python 程序都可使用该模块。
方案三:设置环境变量(系统环境变量path)
配置环境变量大家就比较熟了,不详细描述了
补充 : pycharm自带方式添加path路径
除了上述添加环境变量的方式,pycharm还支持Add source roots to PYTHONPATH添加环境变量:把文件夹Mark Directory as成root就不用手动添加PYTHONPATH了(亲测好用),这样大家看下在导入的模板的时候发现当前模块的上一级路径不在环境变量中就可以采用此方式。
知识点: python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包。只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用,
如果你要使用的模块(py文件)和当前模块在同一目录,只要import相应的文件名就好,比如在a.py中使用b.py: import b
若是在不同目录下l,可用如下 :
import sys
sys.path.append(r‘c:\xxxx\b.py‘) # 这个例子针对 windows 用户来说的
来源:笨猪起飞