摘要:针对使用
PyCharm
打开Github
上克隆的项目或自编的“千层饼”工程文件并导入自编或已存在的模块时遇上的ModuleNotFoundError
报错,本文简要列举了Python
编程环境中引发这项错误的可能原因,并在对比总结网上其他解决方案后给出本人的解决方案。
作者:ALKAID
发表时间:2020年12月16日
原文链接:李芬特小窝
转载博客请注明出处
1. 引用路径和模块名对不上
模块已更名重构或不存在。PyCharm
中支持对整个工程文件中的索引重构,意味着一个文件改名,在当前项目中所有调用了这个模块的地方都会做相应的改动,所以这个不难解决。
2. 模块存在且引用路径正确但就是报错
Python
相对路径与绝对路径设置错误,表现出以下现象。
Traceback (most recent call last):
File "当前运行文件的绝对路径", line 3, in <module>
from BusinessViewLayer.myapp.api import *
ModuleNotFoundError: No module named 'BusinessViewLayer'
注:其中所有的.py文件都是作者自己编写的模块,且都存放在相应的引用路径下。
2.1. 网上常见的解决方案
- 使用
sys.path.append()
添加临时环境变量,这套方案可在Linux环境下部分有效,但在Win环境下可能失效且会让代码变得冗余; - 使用
from .A import B
的相对路径索引方案,这套方案在VS中可以正常编译但在PyCharm
中会进一步引发ImportError
错误;
ImportError: attempted relative import with no known parent package。
2.2. 本文解决方案
解决方案一:依托控制台运行
- 直接编译,发现错误
- 在
PyCharm
中打开 -> 运行/调试设置
- 点击确定后重新运行
- 观察控制台
我们发现,在Python Console
中运行的模块,会自动链接环境变量,这就顺便达成了我们的需求。
解决方案二:使用PyCharm添加环境变量
为什么要提出这套解决方案呢?显然方案一并不是最优解。
因为某些第三方日志库如loguru
在打印运行信息时,会因为各种编码原因导致显示在Python Console窗口中的(中文)信息乱码(但在log文件中显示正常)。
虽然通过设置一些参数可以解决这些问题,但我们不希望在解决问题的过程中引入多余的操作,于是便有了解决方案二。
方案二依然能够达成我们的需求,且不会引发上文所述的问题。
- 打开冰箱门
- 把李芬特装入冰箱
- 关闭冰箱门
至此,报错问题已经完全解决啦~