4

在 Python 2.6.6 中,我有一个与其祖父母名称相同的模块。我的项目结构(使用 Flask 的网络应用程序)大致如下所示:

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。我还有一个名为panel.views.panel的模块。如果从 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意味着database从它旁边的panel.py导入。

不过,这对我来说没有意义,因为PEP 328概述了(看起来像)这个确切的问题,并将绝对导入作为默认值以解决此问题。我使用的是 Python 2.6.6,所以这应该是默认设置。不过可以肯定的是,我添加了这一行from __future__ import absolute_import,但这并没有什么不同;导入 database.py 发生同样的错误。

重命名panel.py解决了这个问题,但是,我非常想知道为什么它在编写时不起作用,特别是如果我可以做任何事情来使它工作。

4

1 回答 1

2

你说你添加了 line from __future__ import absolute_import,但你没有说你添加到哪个文件。请务必将其添加到 root.py。

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

于 2012-09-18T23:47:21.347 回答