2013-10-19 5 views
7

Heroku에 업로드 할 Flask 및 Python이 포함 된 간단한 웹 응용 프로그램이 있습니다. Flask에서 "ImportError : 이름 메일을 가져올 수 없습니다."

다음 스크립트를 로컬 내 응용 프로그램을 시작 :

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) 

는이 오류 메시지가 표시됩니다. 나는이 __init__.py이있는 app 디렉토리 내부

은, 여기에 내가 가져 오기 나에게 문제가 ginving하는 Mail 객체 생성 이었나이다

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

을 그리고 이것은 내가 send_mail 함수를 호출 파일 emails.py입니다 :

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

순환 종속성이 있습니다. 파이썬이 파일을 가져올 때 어떤 일을하는지 알아야합니다.

파이썬이 파일을 가져올 때마다 파이썬은 파일이 이미 이전에 가져 오기 시작했는지 확인합니다. 모듈 A 수입 모듈 B는 모듈 A를 수입하는 경우 따라서, 다음 파이썬 할 것 다음

  • 시작 모듈 A가 모듈 B를 가져올하려고 할 때
  • 이 일시적으로 모듈 A를 실행 중지 모듈 A를 실행하고, 모듈 B를 실행하기 시작합니다.
  • 모듈 B가 모듈 A를 가져 오려고하면, 파이썬은 모듈 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) 

이 파일을 가져올 때 스크립트를 실행하는 것은 바로 파이썬입니다.생성 된 모든 전역 속성은 모듈 속성의 일부가됩니다. 그래서 세 번째 줄을 칠 때쯤에는 'Flask'와 'app'속성이 정의되었습니다. 그러나 세 번째 줄을 칠 때, 파이썬은 indexapp에서 가져 오기 시작합니다. 따라서 app/index.py 파일을 실행하기 시작합니다.

이, 물론, 다음과 같습니다 : 지금까지 오직 app 모듈에 Flaskapp 정의이 파이썬 파일을 가져올 때

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 

기억, 당신은있다. 따라서 mail을 가져 오려고하면 작동하지 않습니다.

그래서, 당신은 당신의 코드를 재 배열 할 필요가 app.indexappapp.index을 가져 오기 전에 그 속성을 정의하는, app의 속성에 의존하는 경우 있도록.

+0

마크 힐드리스 (Mark Hildreth)의 답답한 답변에 감사드립니다. 내가하는 말을 이해하지만 코드를 올바르게 다시 배열 할 수없는 것 같습니다. 나는 계속 노력할 것이다. – Xar

+0

확인. 이제 알겠습니다. 다시 한번 감사드립니다. 파이썬에서 수입이 어떻게 작동하는지 생각 해보지 않았습니다. – Xar

+0

@Xar : 해결 방법을 알려주실 수 있습니까? –

0

이 아마 문제 : 이것은 내 디렉토리 목록이

입니다 현재 모듈, 중첩 된 앱 모듈이 아닙니다. 시도해보십시오 :

from . import app, mail 

그래도 작동하지 않으면 더 자세한 디렉토리 목록으로 질문을 업데이트해야합니다.

+0

제안 된대로 코드를 변경하지만 여전히 동일한 오류가 발생합니다. 내가 말한대로 디렉토리 목록으로 내 질문을 업데이트 할 것입니다. – Xar

관련 문제