2013-10-19 51 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

相關問題