无法从包中导入Python模块

时间:2019-12-17 02:08:10

标签: python python-3.x python-import

我具有如下的包/模块结构:

root/
├ aa
│ └──bb
│    └──b.py
├ cc
│ └──bb
│    └──b.py

在IPython中,我试图像这样从b导入aa.bb

import sys
sys.path.append('/path/to/root/')

from aa.bb import b

但是我收到了ModuleNotFoundError

ModuleNotFoundError: No module named 'aa.bb'

仅导入aa即可,导入cc.bb.b也是如此:

import sys
sys.path.append('/path/to/root/')

import aa
from cc.bb import b

是什么导致模块被忽略,我该如何调试?我怀疑这是由于IPython设置中的某种机制在起作用,但不知道在哪里查看。

2 个答案:

答案 0 :(得分:0)

您尝试使用

import aa.bb.b

这对我有用,或者对于b.py中的特定功能,您可以使用

from aa.bb.b import func

这也是另一个有关类似主题的堆栈溢出文章的链接: Importing files from different folder

答案 1 :(得分:0)

启动时似乎正在加载其他aa模块。

在新的外壳中,您可以使用sys.modules.keys()检出导入的模块,并发现aa已经存在。您可以使用importlib查看源位置:

importlib.util.find_spec('aa')
> ModuleSpec(name='aa', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f8f5c8dd0>, origin='/not/the/right/path/aa', submodule_search_locations=['/not/the/right/path/aa'])

您可以在确保正确的importlib之后使用sys.path重新加载已加载的模块,该模块应加载目标模块:

import importlib                                                                                                                     
importlib.reload(aa)

from aa.bb import b