Python 导入文件时导入不起作用

Python import doesn't work when file is imported

我很难理解 python 导入器的工作原理。 我有一个 python 脚本 (fractalDimension.py) 导入子模块 ("greedyColoring.py") 使用:

from boxCovering.greedyColoring import *

直接调用就可以了:

python fractalDimension.py

当我将脚本移动到一个文件夹并添加一个导入 fractalDimension.py 的主脚本时,问题就开始了,因为现在 boxCovering 子模块的导入不起作用。

在主脚本中我调用了 fractalDimension 方法:

import fractality.fractalDimension as fd

fd.calculate()

但是当我 运行

python main.py

我收到以下错误

Traceback (most recent call last):
File "main.py", line 5, in <module>
  import fractality.fractalDimension as fd
File "fractalDimension.py", line 11, in <module>
  from boxCovering.greedyColoring import *
ImportError: No module named 'boxCovering'

目录布局:

main.py
fractalDimension/
 |
 +-- __init__.py
 +-- fractalDimension.py
 +-- boxCovering/
     |
     +-- __init__.py
     +-- greedyColoring.py

两个初始化文件都是空的

为什么python找不到boxCovering模块?

错误是由于 python 正在 PYTHONPATH 中搜索名为 boxCovering 顶级 包,并且none 存在(您在当前目录中只有一个 sub-包,但未搜索到)。

当你想导入一个 subpackage/submodule 时你想使用(显式)相对导入:

from .boxCovering.greedyColoring import *

注意开头的 .(点)。

或者使用绝对导入:

from fractality.fractalDimension.boxCovering.greedyColoring import *

在 python2 中,导入允许隐式相对导入,这正是您想要做的。在这种情况下,导入:

from boxCovering import X

按照您的方式完成可能有两种不同的含义:

  • 导入 fractalDimension 包的子包 boxCovering
  • 导入顶层包boxCovering

在 python3(参见 What's new? and relevant PEP 0328)中,他们决定这样的导入 always 具有第二个含义。如果你想要一个相对导入,你必须明确地声明所以通过使用相对语法,它在模块名称的开头使用一个点。

每个点表示转到上面的一个目录,因此 . 表示当前目录,而 .. 表示父目录(如在 unix 路径中)等。

您可以在 python2 添加以下内容启用此语义:

from __future__ import absolute_import

在文件的顶部。