2012-09-18 36 views
4

在Python 2.6.6中,我有一个和它的祖父母相同的模块。我的项目结构(瓶使用一个Web应用程序)看起来大致是这样的:导入一个与祖父包相同的模块

panel/ 
    run.py 
    panel/ 
    __init__.py 
    database.py 
    views/ 
     __init__.py 
     root.py 
     dash.py 
     panel.py 
    users/ 
     __init__.py 
     models.py 

注意包的名字,旁边run.py,是面板。我也有一个名为panel.views.panel的模块。如果从面板内/ __ init__.py我导入panel.views.panel,使用任何的这三种样式:

from panel.views import panel 
from panel.views import panel as panel_view 
import panel.views.panel as panel_view 

进口panel.py,没有我的其他进口后正常工作。例如,panel.users.models尝试导入database.py,这回溯抛出:

Traceback (most recent call last): 
    File "run.py", line 5, in <module> 
    from panel import app 
    File "/opt/www/panel/panel/__init__.py", line 8, in <module> 
    from panel.views import root 
    File "/opt/www/panel/panel/views/root.py", line 9, in <module> 
    from panel import database; 
ImportError: cannot import name database 

我在#pocoo IRC频道的几个人说话,从他们描述一下,问题是从views/root.py中,Python认为import panel.database意味着从的panel.py旁边输入database

这对我来说没有任何意义,虽然因为PEP 328轮廓(看起来像)这个确切的问题,并且为了解决这个问题而使绝对导入成为默认值。我使用Python 2.6.6,所以这应该是默认的。可以肯定的是,我添加了行from __future__ import absolute_import,但这没有什么区别;发生了同样的错误导入database.py。

重命名panel.py修复了这个问题,不过,我非常好奇知道为什么,因为它是这样写是不行的,尤其是如果有什么我可以做,使这项工作。

+0

不做到这一点请...不良作风...... –

+1

通常会有之间的“不良风气”的差异和“丧失工作能力这种方式“,即使它是不好的风格,我想明白为什么它不起作用。 – skyler

回答

2

你说你添加了行from __future__ import absolute_import,但你没有说你添加了哪个文件。一定要将其添加到root.py.

蟒蛇教程的这部分解释了什么是你的情况发生了:http://docs.python.org/tutorial/modules.html#intra-package-references

+0

将该行添加到root.py似乎解决了我的问题。但我不明白为什么,因为绝对导入应该是我的Python版本(2.6.6)中的默认导入。从链接的PEP中,Python 2.5需要导入absolute_import。同样来自PEP的“在Python 2.6中,导致内部包导入的任何导入语句都会引发DeprecationWarning ...”您可以对此进行评论吗? – skyler

相关问题