Python 3中的问题绝对从包内的脚本导入

时间:2017-09-04 10:41:57

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

我觉得这是一个相当基本的问题,所以我只是更加不安,因为我很长一段时间都无法修复它。假设我有以下文件夹结构:

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的一部分。但我该如何解决这个问题呢?

1 个答案:

答案 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