当前位置: 首页 > 面试题库 >

Flask中的“ ImportError:无法导入名称邮件”

江俊能
2023-03-14
问题内容

html" target="_blank">构建了一个简单的Web应用程序,其中包含Flask和Python,我打算将其上传到Heroku。

在本地启动我的应用程序时,请使用以下脚本:

#!venv/bin/python
from app import app
app.run(debug = True)

我收到此错误消息:

Traceback (most recent call last):
File "./run.py", line 2, in <module>
    from app import app, mail
File "/home/ricardo/personalSite/app/__init__.py", line 3, in <module>
    from app import index
File "/home/ricardo/personalSite/app/index.py", line 6, in <module>
    from emails import send_email
File "/home/ricardo/personalSite/app/emails.py", line 2, in <module>
    from app import app, mail
ImportError: cannot import name mail

因此,它无法导入mail

app目录中我有this __init__.py,这是我创建的Mail对象,导致导入困难:

from flask import Flask
app = Flask(__name__)
from app import index
from flask.ext.mail import Mail
mail = Mail(app)

这是emails.py我调用该send_mail函数的文件:

from flask.ext.mail import Message
from app import app, mail
from flask import render_template
from config import ADMINS
from decorators import async

因此,根据错误消息,错误位于此文件的中from app import app, mail

问题是什么?为什么不能导入mail

更新:

这是我的目录清单:

persSite\
  venv\
    <virtual environment files>
  app\
    static\
    templates\
    __init__.py
    index.py
    emails.py
    decorators.oy
  tmp\
  run.py

问题答案:

您具有循环依赖关系。您必须了解Python在导入文件时在做什么。

每当Python导入文件时,Python都会查看该文件是否之前已经开始导入。因此,如果模块A导入模块B,而模块B导入模块A,则Python将执行以下操作:

  • 开始运行模块A。
  • 当模块A尝试导入模块B时,请暂时停止运行模块A,然后开始运行模块B。
  • 然后,当模块B尝试导入模块A时,Python将不会继续运行模块A来完成;相反,模块B将只能从模块A导入在模块B开始运行之前已经在其中定义的属性。

这是app/__init__.py,这是第一个要导入的文件。

from flask import Flask
app = Flask(__name__)
from app import index # <-- See note below.
from flask.ext.mail import Mail
mail = Mail(app)

导入此文件时,只有Python运行脚本。创建的所有全局属性都将成为模块属性的一部分。因此,当您点击第三行时,已经定义了“ Flask”和“
app”属性。但是,当你到了第三行,Python中开始尝试导入indexapp。因此,它开始运行app/index.py文件。

当然,这看起来如下所示:

from flask.ext.mail import Message
from app import app, mail # <-- Error here
from flask import render_template
from config import ADMINS
from decorators import async

请记住,当这条巨蟒文件正在导入,您迄今为止只定义了Flaskappapp模块。因此,尝试导入mail将不起作用。

因此,您需要重新排列代码,以便如果app.index依赖于中的属性app,则app在尝试导入之前定义该属性app.index



 类似资料:
  • 问题内容: 我有两个文件, app.py mod_login.py 而python返回此错误: 如果删除from app import app,代码将起作用,但是如何访问? 问题答案: 问题是你有一个循环导入:在app.py中 在mod_login.py中 这在Python中是不允许的。有关更多信息,请参见Python中的循环导入依赖项。简而言之,解决方案是 要么将所有内容收集到一个大文件中 使用

  • 问题内容: 我正在尝试运行以下简单代码 但我收到以下错误 我正在Windows 10下使用python 2.7。 我已经安装了,但是似乎无法解决问题 任何帮助表示赞赏。 问题答案: 如果查看引起错误的行,则会看到以下内容: 该行注释将依赖项声明为(对于 Intel Math Kernel Library )。这意味着您已经安装了by ,但是the是由预编译的存档安装的,其期望值为。 通过从此处的w

  • 问题内容: 我没有找到解决方案,有人可以帮忙吗? 问题答案: 1. 尝试更新 2. 尝试重新安装 以下代码段将打印到控制台什么?

  • 问题内容: 我正在尝试使用ttk模块为tkinter中的GUI应用程序为Windows创建可执行文件。我使用cx_freeze制作了一个exe,但是当我在控制台中运行该应用程序时,出现以下错误: 这是我的代码中的第14和15行: 问题答案: 看起来cx_freeze没有意识到它应该包含该模块,该模块有条件地由导入。您可以告诉它在命令行参数或关键字参数to中明确包含该模块。

  • 问题内容: 我无法使ffprobe软件包在Python 3.6中工作。我使用pip安装了它,但是当我输入时说 init.py文件仅包含一行。 包括“ C:\ Python \ Python36 \ lib \ site-packages”,这是ffprobe目录所在的位置。 安装和导入软件包在Python 2.7中都可以正常工作。但是我想在Python 3中使用它,即使这意味着对.py文件进行手动

  • 问题内容: 我将Jupyter笔记本从旧版本更新为最新的5.3.1。但是,当我尝试从anaconda启动笔记本电脑时,它引发了导入错误:我尝试删除并安装Jupyter软件包,但问题仍然存在。 问题答案: 您需要从终端手动更新jupyter_core和jupyter_client:

  • 问题内容: 我无法从sklearn库导入cross_validation;我使用sklearn版本0.20.0 稍后在代码中: 错误: 问题答案: 发生这种情况是因为中没有对象。您可能正在寻找更类似于该功能的东西。您可以通过访问 但是,您无需导入任何交叉验证软件即可执行训练测试拆分,因为这只会从数据中随机抽样。尝试 其次是

  • 问题内容: 我安装了,然后执行以下操作: 我收到以下错误: 但是,如果我分别导入它们,一切都很好,即: 您知道可能是什么问题吗? 问题答案: 我也遇到了这个问题。如果安装了PIL,则可能会发生这种情况,然后在其顶部安装Pillow。 转到/usr/local/lib/python2.7/dist-packages/并删除名称中带有“ PIL”的任何内容(包括目录)。如果有Pillow .egg文件