我具有如下的包/模块结构:
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设置中的某种机制在起作用,但不知道在哪里查看。
答案 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