2013-10-19 49 views
7

我已经构建了一个简单的Web应用程序,包含Flask和Python,我打算上传到Heroku。“导入错误:无法导入名称邮件”在Flask

本地时开始我的应用程序,用下面的脚本:

#!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目录我有这个__init__.py,这里是我创建Mail对象时ginving我麻烦进口:

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 

回答

12

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

只要Python导入文件,Python就会查看文件是否已经开始导入。因此,如果模块A导入模块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开始尝试从app导入index。所以,它开始运行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 

记住,当这条巨蟒文件正在导入,您迄今只有app模块中定义Flaskapp。因此,试图导入mail将不起作用。

所以,你需要重新安排你的代码,这样,如果app.index依赖于app的属性,app定义尝试导入app.index之前的属性。

+0

谢谢你的精心解答Mark Hildreth。我明白你在说什么,但我似乎还没有正确地重新排列我的代码。我会继续努力。 – Xar

+0

好的。我现在明白了。再一次,谢谢你。我从来没有想过如何导入Python的工作。 – Xar

+0

@夏:你可以请分享你如何解决它? –

0

这可能是这个问题:

from app import app, mail 

在文件 '应用程序/ emails.py' 的进口主要是来自当前模块,而不是嵌套的应用程序模块。请尝试:

from . import app, mail 

如果它不起作用,您应该更新您的问题与更详细的目录列表。

+0

我按照建议更改了代码,但仍然给我提供了同样的错误。正如你所说,我会用我的目录列表更新我的问题。 – Xar

相关问题