python import 问题"ModuleNotFoundError: No module named "

今天用到嵌套import的时候发现一个问题。请看下面:
在这里插入图片描述
看上面的test1的包,下面是各个源文件的内容:

#a.py
def p():
    print("12345")
#b.py
import a
#from . import a
def bi():
    a.p()
#c.py
from .src import b
def yi():
    print("wo")
    b.bi()
#d.py
# import sys
# sys.path.append('./py/src')
import py.c
if __name__ == '__main__':
    py.c.yi()

这里运行d.py就会报错:

/home/andy/anaconda3/bin/python /home/andy/work/mypython/test/test1/d.py
Traceback (most recent call last):
  File "/home/andy/work/mypython/test/test1/d.py", line 3, in <module>
    import py.c
  File "/home/andy/work/mypython/test/test1/py/c.py", line 2, in <module>
    from .src import b
  File "/home/andy/work/mypython/test/test1/py/src/b.py", line 2, in <module>
    import a
ModuleNotFoundError: No module named 'a'

Process finished with exit code 1

这是为什么呢?这涉及到Python的导入的机制,要弄清楚这个问题首先清楚Python的导入机制。下面先让我们来了解一下该机制。

(1)import a 首先这句语句的做了哪些事:

创建命名空间‘a’。 在‘a’命名空间中倒入a.py代码,然后执行a.py的代码。

(2)from . import a 这语句是和“import a”是有些不同的
这语句是在当前的命名空间(‘b’的命名空间)中倒入a.py的代码,然后执行a.py中的代码,并不会创建新的命名空间‘a’。

那上面的到底是什么问题呢,我们来看一下:
b.py中:
import a 如上(1)解释,会创建新的命名空间‘a’

c.py中:
from .src import b
这句语句是在当前命名空间‘c’ 倒入src包的b模块代码(也就是b.py的代码),然后执行b中的代码,但b中的代码有一句语句‘import a’,记住这是在当前的命名空间,当前的工作目录是c.py 同级的路径。它会在c.py同级路径下查找a 模块,但其实是找不到的。因为a模块是在‘./src/’下的。所以就会出错

d.py中:import py.c
创建新的命名空间,然后倒入c.py的代码,当执行到from .src import b,就如上面的解释一样了,发生问题了。

解法一:
把b.py 中的‘import a’ 改为‘from . import a’

解法二:
在d.py文件中加上以下语句,添加查找模块的路径,让解释气可以查找到a模块。

扫描二维码关注公众号,回复: 8830384 查看本文章
import sys
sys.path.append('./py/src')
sys.path.append('./py/')
import py.c
if __name__ == '__main__':
    py.c.yi()

文章写的不好,有些术语不知道怎么表述,如有错误的地方可以指出来,等我也学习以下。

发布了18 篇原创文章 · 获赞 1 · 访问量 206

猜你喜欢

转载自blog.csdn.net/andyonlines/article/details/95868680