Python模块可以';不能从包装中进口

Python模块可以';不能从包装中进口,python,python-3.x,python-import,Python,Python 3.x,Python Import,我的包/模块结构如下: root/ ├ aa │ └──bb │ └──b.py ├ cc │ └──bb │ └──b.py 在IPython中,我试图从aa.bb导入b,如下所示: import sys sys.path.append('/path/to/root/') from aa.bb import b 但是我得到了一个modulenofound错误 ModuleNotFoundError: No module named 'aa.bb' 只导入aa工作,导入cc.

我的包/模块结构如下:

root/
├ aa
│ └──bb
│    └──b.py
├ cc
│ └──bb
│    └──b.py
在IPython中,我试图从
aa.bb
导入
b
,如下所示:

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

from aa.bb import b
但是我得到了一个modulenofound错误

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设置中存在某种机制造成的,但我不知道该从何处查找。

您是否尝试过使用

import aa.bb.b
这对我来说很有效,或者对于b.py中的一个特定函数,您可以使用它

from aa.bb.b import func
这里还有一个链接,指向另一篇关于类似主题的堆栈溢出帖子:

似乎在启动时加载了不同的
aa
模块

在新的shell中,您可以使用
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'])

刚试过这个,对我很有效。您确定您的路径正确吗?
os.listdir(使用的路径相同)
给出了什么?路径正确,文件按预期列出。我怀疑我的IPython设置有什么奇怪的地方,我用了一个更简单的例子更新了Q,而且我的shell似乎对待一个特定的文件路径与另一个不同。这对一个玩具示例有效(就像我以前使用的方法一样),但对我的实际用例无效!我真的很想学习一些工具来调试它,因为我正在琢磨是什么导致我的模块导入失败。
import importlib                                                                                                                     
importlib.reload(aa)

from aa.bb import b