2012-09-18 33 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

相關問題