【问题标题】:Python import doesn't work when file is imported导入文件时Python导入不起作用
【发布时间】:2015-07-27 05:41:19
【问题描述】:

我很难理解 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 python-3.4 python-import python-module


    【解决方案1】:

    错误是由于python正在PYTHONPATH内部搜索一个名为boxCovering顶级包并且不存在(你只有一个sub em>-package 在当前目录中,但不搜索)。

    当你想导入一个子包/子模块时,你想使用(n显式)相对导入:

    from .boxCovering.greedyColoring import *
    

    注意开头的.(点)。

    或者使用绝对导入:

    from fractality.fractalDimension.boxCovering.greedyColoring import *
    

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

    from boxCovering import X
    

    以你正在做的方式完成可能有两种不同的含义:

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

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

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

    您可以在 python2 上启用此语义添加:

    from __future__ import absolute_import
    

    在文件的顶部。

    【讨论】:

    • 非常感谢@Bakuriu 的回答和解释。导入开头的点使它起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2018-01-08
    • 2023-03-25
    • 2018-10-13
    相关资源
    最近更新 更多