我觉得这是一个相当基本的问题,所以我只是更加不安,因为我很长一段时间都无法修复它。假设我有以下文件夹结构:
foo
|- first_module.py
|- __init__.py
|- bar
|- second_module.py
|- __init__.py
foo和bar是目录。在first_module.py中,我有一个引用second_module.py的绝对import语句:
import foo.bar.second_module
现在,如果将first_module.py作为脚本运行(foo是工作目录),我会收到此错误
ModuleNotFoundError: No module named 'foo':
拜托,有谁可以向我解释为什么会这样?我已经检查过foo是否在sys.path中。我已经阅读了docs和其他一些stackoverflow帖子。我认为它可能与解释器有关,不知道first_module.py是包foo的一部分。但我该如何解决这个问题呢?
答案 0 :(得分:1)
问题是尝试import foo.bar.second_module
会要求您的目录结构有foo
目录作为当前工作目录的子目录,即:
foo
|- first_module.py
|- __init__.py
|- foo
|- bar
|- second_module.py <-- at foo.bar.second_module
|- __init__.py
要保留原始目录结构并成功导入,只需将first_module
改为使用import bar.second_module
。
为什么会这样?
当import
时,您应该将点.
视为与路径分隔符类似。因此,使用以下示例布局:
foo
|- first.py
|- bar
|- second.py
|- third.py
如果您想import
second.py
模块first.py
,则必须写import bar.second
。如果您要从third
导入second
,则可以编写import third
,因为它们都位于同一目录中。
请注意,如果您尝试从import bar.third
导入,则仍需要编写first
。