模块中的Python绝对导入失败

Sja*_*aak 5 python python-import importerror

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

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)
Run Code Online (Sandbox Code Playgroud)

PYTHONPATH的配置为/ my_project.

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

from datacheck.business import BusinessCheck
business = BusinessCheck()
business.check_data()
Run Code Online (Sandbox Code Playgroud)

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

from datacheck.config import BusinessConfig
from datacheck.datacheck import DataCheck
Run Code Online (Sandbox Code Playgroud)

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 Code Online (Sandbox Code Playgroud)

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

它让我有点大吃一惊,我不明白为什么我在datacheck中的绝对导入不起作用 - 谁能解释一下?

Bjö*_*lex 7

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

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

如果要使用绝对导入,请将所有内容从模块移动datacheck__init__.py包中,或重命名.