我构建的是一个简单的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
目录中,我有__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
答案 0 :(得分:16)
你有一个循环依赖。你必须意识到Python在导入文件时正在做什么。
每当Python导入文件时,Python都会查看该文件是否已经开始导入。因此,如果模块A导入导入模块A的模块B,那么Python将执行以下操作:
这是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开始尝试从index
导入app
。因此,它开始运行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
请记住,在导入此Python文件时,您到目前为止只在Flask
模块中定义了app
和app
。因此,尝试导入mail
将无效。
因此,您需要重新安排代码,以便app.index
依赖于app
中的属性,app
在尝试导入app.index
之前定义该属性。< / p>
答案 1 :(得分:0)
这可能是问题所在:
from app import app, mail
在'app / emails.py'文件中,导入来自当前模块,而不是嵌套的应用程序模块。尝试:
from . import app, mail
如果它不起作用,您应该使用更详细的目录列表更新您的问题。