在 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 channel 和一些人谈过,根据他们的描述,问题是在 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 修复了这个问题,但是,我非常想知道为什么它不能像它写的那样工作,特别是如果我能做些什么来使它工作.
最佳答案
你说你添加了 from __future__ import absolute_import
行,但你没有说你添加到哪个文件。请务必将其添加到 root.py。
python 教程的这一部分解释了您的情况:http://docs.python.org/tutorial/modules.html#intra-package-references
关于python - 导入一个与祖父包同名的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12485109/