2013-10-19 1 views
7

FlaskとPythonの簡単なWebアプリケーションがあり、これをHerokuにアップロードしようとしています。 Flaskの "ImportError:name mailをインポートできません"

次のスクリプトで、ローカルに私のアプリを起動する:

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をインポートすることはできません。

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

は、私は、このエラーメッセージが表示されます。

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

そして、これは私がsend_mail関数を呼び出すファイルemails.pyです::

私はこの __init__.pyを持って appディレクトリ内では、ここで私は私の輸入に支障をginvingさ 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をインポートできないのですか?

アップデート:インポートから提示されたファイル 'アプリ/ emails.py' は、

from app import app, 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をインポートモジュールAインポートモジュールB場合したがって、その後Pythonは以下の操作を行います:モジュールAがモジュールAの実行を停止、一時的に、モジュールBをインポートしようとすると

  • スタートモジュールA.
  • を実行し、そして
  • モジュールBがモジュールAをインポートしようとすると、PythonはモジュールAの実行を続行しません。代わりに、モジュールBは、モジュールBが実行を開始する前にすでに定義されていた属性のみをモジュールAからインポートすることができます。

ここには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に過ぎません。作成されたグローバル属性は、モジュールの属性の一部になります。だから、3行目を叩く頃には、 'Flask'と 'app'という属性が定義されています。しかし、3行目を打つと、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 

このPythonのファイルがインポートされているとき、あなたはこれまでのところ唯一appモジュールでFlaskappを定義して、覚えておいてください。したがって、mailをインポートしようとすると機能しません。

だから、あなたはそのようapp.indexappapp.indexをインポートしようとする前に、その属性を定義していること、app内の属性に依存している場合、あなたのコードを再配置する必要があります。

+0

あなたの奇妙な答えマーク・ヒルドレスさんありがとうございました。私はあなたが言っていることを理解していますが、コードを正しく並べ替えることができないようです。私はそれに取り組んでいきます。 – Xar

+0

分かりました。もう一度、ありがとう。私は、Pythonでどのようにインポートが機能するかは考えていませんでした。 – Xar

+0

@ Xar:あなたはそれを修正する方法を教えていただけますか? –

0

これはおそらく問題である:これは私のディレクトリリストが

です現在のモジュールであり、ネストされたアプリケーションモジュールではありません。試してください:

from . import app, mail 

問題が解決しない場合は、より詳細なディレクトリリストを使用して質問を更新する必要があります。

+0

私は示唆しているようにコードを変更しますが、それでも私には同じエラーが表示されます。あなたの言ったように私はあなたのディレクトリリストに私の質問を更新します。 – Xar