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

时间:2015-05-15 10:23:55

标签: python python-3.4 python-import python-module

我很难理解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

两个init文件都是空的

为什么python找不到boxCovering模块?

1 个答案:

答案 0 :(得分:3)

错误是由于python正在boxCovering内搜索名为PYTHONPATH顶级包而且不存在(您只有 sub -package在当前目录中,但是没有被搜索过。

如果要导入子包/子模块,则要使用(n显式)相对导入:

from .boxCovering.greedyColoring import *

注意开头的.(点)。

或者使用绝对导入:

from fractality.fractalDimension.boxCovering.greedyColoring import *

在python2中,导入允许隐式相对导入,这是您尝试执行的操作。在那种情况下导入:

from boxCovering import X
以你正在做的方式完成可能有两个不同的含义:

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

在python3中(参见What's new?和相关的PEP 0328),他们认为这样的导入总是具有第二个含义。如果您想要相对导入,则必须使用相对语法来显式状态,该语法在模块名称的开头使用了一个点。

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

您可以在python2上添加:

启用此语义
from __future__ import absolute_import

位于文件顶部。