模块中的Python绝对导入失败

时间:2011-11-16 10:06:12

标签: python importerror python-import

我有一个看起来像这样的项目:

my_project/
          __init__.py -- empty
          run.py
          datacheck/
                  __init__.py -- empty
                  datacheck.py -- containing class DataCheck(object)
                  config.py -- containing BusinessConfig(object)
                  business.py -- containing class BusinessCheck(DataCheck)

我的PYTHONPATH已配置为包含/ my_project。

在run.py中,我有以下代码:

from datacheck.business import BusinessCheck
business = BusinessCheck()
business.check_data()

在business.py中,我有以下导入失败:

from datacheck.config import BusinessConfig
from datacheck.datacheck import DataCheck

from .config import BusinessConfig这样的相对导入有效 - 但是我已经在很多线程中读到绝对导入是首选。

为了进行简单的测试,我还创建了以下内容:

myproject/
          __init__.py -- empty
          run_test.py
          test/
              __init__.py -- empty
              test1.py -- containing class Test1(object)
              test2.py -- containing class Test2(Test1)

run_test.py导入并运行Test2类,但这并没有失败。

这让我有点惊讶,我不明白为什么我在datacheck中的绝对导入不起作用 - 有人可以解释一下吗?

2 个答案:

答案 0 :(得分:6)

如果您的模块可以用作__main__,您应该更喜欢绝对导入,如documentation中所述。如果没有,相对进口是好的。

这些导入失败,因为您的包datacheck包含模块datacheck(同名)。查找名称时,Python首先隐式查看包内部。在那里,它找到了模块datacheck。但是,此模块不包含名称为config的任何内容,因此导入失败。

如果您想使用绝对导入,请将模块datacheck中的所有内容移动到包的__init__.py中,或重命名。

答案 1 :(得分:2)

我知道这是多年之后,但为了其他人在这里搜索,我能用这段代码解决类似的问题:

from __future__ import absolute_import

之后,绝对导入在Python 2.6和2.7中运行良好。