python - 导入一个与祖父包同名的模块

标签 python flask

在 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/

相关文章:

Python:快速和肮脏的数据类型(DTO)

python - 如何批准用于在(Uniswap 路由器合约)上花费的代币

python - 导入错误 : cannot import name celery

flask - Jinja Flask 问题 : Uncaught SyntaxError: Unexpected token { in JSON at position 1 at JSON. 解析

python - 使用 pandas GroupBy 聚合字符串列

python - Pandas - 在多列上有条件地合并数据框

python - Scrapy 中的链接收获

python - flask.logger 比更通用的 python 日志记录模块有什么优势?

python - 操作错误 : no such table: entries while "init_db()" already inserted in flaskr. py

python - 使用 Flask-Kerberos 时无法通过 curl 访问应用程序