【问题标题】:relative imports in python in flask app烧瓶应用程序中python中的相对导入
【发布时间】:2016-04-05 04:20:00
【问题描述】:

我阅读了许多 SO 问题和博客。我正在尝试构建我的烧瓶应用程序。我的应用程序的当前结构如下:

application
    run_server.py
    /config
       __init__.py
       production.py
       staging.py
       development.py
    /app
       __init__.py
       /site
           __init__.py
           views.py

现在,在app/__init__.py 内部,我想根据我的环境(开发、登台、生产)访问配置。

from ..config import config

我收到此错误:

ValueError:尝试相对导入超出顶级包

我尝试过使用-m 开关。 我还尝试将PYTHONPATH 设置为我的根目录,以告诉解释器什么是顶级包。 我认为我在相对导入方面缺少一些基本知识。

【问题讨论】:

  • 你可以导入模块而不是命名空间,没有 config.py 文件

标签: python flask


【解决方案1】:

尝试使用absolute import。恕我直言,这让事情变得更容易理解

from __future__ import absolute_import
from application.config import production

这是绝对的,因为您正在指定要导入的确切路径,以减少歧义。

另外,您在application 文件夹中缺少__init__.py

【讨论】:

    【解决方案2】:

    如果您通过run_server.py 运行应用程序,则无需在app/__init__.py 中进行相对导入。你可以简单地说,

    from config import <production/staging/development>
    

    这是因为,当您的解释器解释run_server.py 时,在from app import &lt;something&gt; 行,它将获取app/__init__.py 内容并尝试在顶层执行它们,即从目录application

    现在,假设您在顶层运行 from ..config import config。显然,它会抛出一个错误。

    【讨论】:

      【解决方案3】:

      假设你有configin application/config/__init__.py

      你还需要application目录下的__init__.py,如果没有,那么application/app是你的顶级包,你不能访问application/config

      【讨论】:

        猜你喜欢
        • 2015-09-07
        • 2012-12-01
        • 2016-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多