ModuleNotFoundError: No module n
问题
ModuleNotFoundError: No module named 'xxx'
分析
这一问题一般出现在import时,如from xxx import A,或from xxx.A import B
解决方案
解决方便比较简单,就是把xxx所在的目录添加到当前python能找到的地方即可。
具体实施
首先来查看一下sys.path默认包含什么吧。sys.path是个list。
import sys
print(sys.path)
上述命令,可以打印出当前python文件执行时默认会查找的目录,可以看到,当前python文件所在的父目录是可以找到的,也就是说与这个文件平级的所有文件都可以找到,直接用from 平级python文件 import A,B都可以。但是再上一级目录、上上一级目录、上上级目录的另一子目录,默认都是找不到的。解决方案就是把要查找的目录都加到sys.path之中。
os.path.realpath(__file__)是指当前python文件的path
os.path.dirname(os.path.realpath(__file__))是指当前python文件的上一级目录
os.path.dirname(os.path.dirname(os.path.realpath(__file__)))是指当前python文件的上上一级目录
所以,如果要import的文件是在上上一级目录,在python文件中添加如下语句即可。
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
那,如果是上上一级目录的另一个子目录呢。
A
--B
----b.py
--C
----c.py
如上,运行c.py,但c.py要import b.py,sys.path默认是包含C的,A是上上一级目录,用上面所说的语句即可找到,那要找到B呢,就要再在sys.path中添加B目录,即os.path.join(A目录, "B")
import sys
import os
A_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
B_dir = os.path.join(A_dir, B)
sys.path.append(A_dir)
sys.path.append(B_dir)
另外,在python3中最好不要用相对引用(from .A import B),还是用sys.path把需要的目录都添加进去为好。