解决模块导入ModuleNotFoundError: No module named 'XXX'的问题
想要解决上面的问题,我们需要明确import导入本质,才好从根上去解决问题。
import导入本质
通常情况下,当使用 import 语句导入模块后,Python 会按照以下顺序查找指定的模块文件:
- 在当前目录,即当前执行的程序文件所在目录下查找;
- 到 PYTHONPATH(环境变量)下的每个目录中查找;
- 到 Python 默认的安装目录下查找。
以上所有涉及到的目录,都保存在标准模块 sys 的 sys.path 变量中,通过此变量我们可以看到指定程序文件支持查找的所有目录。换句话说,如果要导入的模块没有存储在 sys.path 显示的目录中,那么导入该模块并运行程序时,Python 解释器就会抛出 ModuleNotFoundError(未找到模块)异常。
解决方式
针对于上述三种查找模块的方式,对应的给出三种解决方案:
- 向 sys.path 中临时添加模块文件存储位置的完整路径;
- 将模块放在 sys.path 变量中已包含的模块加载路径中;
- 设置 path 系统环境变量。
1.临时添加模块完整路径
模块文件的存储位置,可以临时添加到 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路径下。
需要注意的是,通过该方法添加的目录,只能在执行当前文件的窗口中有效,窗口关闭后即失效。
2. 将模块保存到指定位置
Python 程序默认的模块加载路径保存在 sys.path 变量中,因此,我们可以在module2 .py 程序文件中先看看 sys.path 中保存的默认加载路径,向 say.py 文件中输出 sys.path 的值,如下所示:
['D:\\autoCMS_Interface\\test_moudle',
'D:\\autoCMS_Interface',
'C:\\Program Files\\JetBrains\\PyCharm 2020.2.3\\plugins\\python\\helpers\\pycharm_display',
'C:\\Program Files\\Python37\\python37.zip', 'C:\\Program Files\\Python37\\DLLs',
'C:\\Program Files\\Python37\\lib', 'C:\\Program Files\\Python37',
'C:\\Users\\AppData\\Roaming\\Python\\Python37\\site-packages',
'C:\\Program Files\\Python37\\lib\\site-packages',
'C:\\Program Files\\JetBrains\\PyCharm 2020.2.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
上面的运行结果中,列出的所有路径都是 Python 默认的模块加载路径,但通常来说,我们默认将 Python 的扩展模块添加在
lib\site-packages
路径下,它专门用于存放 Python 的扩展模块和包。所以,我们可以直接将我们已编写好的 module3.py 文件添加到
lib\site-packages
路径下,就相当于为 Python 扩展了一个 module3模块,这样任何 Python 程序都可使用该模块。3. 设置环境变量
配置环境变量大家就比较熟了,不详细描述了
4. pycharm自带方式添加path路径
除了上述添加环境变量的方式,pycharm还支持Add source roots to PYTHONPATH添加环境变量:
把文件夹Mark Directory as成root就不用手动添加PYTHONPATH了(亲测好用),这样大家看下在导入的模板的时候发现当前模块的上一级路径不在环境变量中就可以采用此方式。
每天进步一小步 日积月累跨大步