2011-11-16 109 views
5

我有一个项目,它看起来像这样:模块Python的绝对导入失败

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类,这并没有失败。

这让我有些fla然心动,我不明白为什么我的数据库绝对导入不起作用 - 任何人都可以解释吗?

+0

'from datacheck.business import Business'but'business.py - contains class BusinessCheck(DataCheck)'...'Business'类在哪里? – eumiro

+0

你在'datacheck'中是否有'__init __。py'文件?该文件使目录成为一个包,并且可以为空。 –

+0

@eumiro:对不起,有点小错 - 改正它。 –

回答

6

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

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

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

+0

(datacheck在datacheck)是一直以来,我从来不知道这是不可能的!谢谢一堆:-) –

+0

@SjaakTrekhaak:这是可能的,但它造成了一个模糊性,所以你必须格外小心。 –

2

我知道这是多年以后,但对于其他人在这里寻找的缘故,我能够解决类似的问题,这段代码:

from __future__ import absolute_import 

之后,绝对进口工作正常Python 2.6和2.7。