python导入顺序如何影响名称?

时间:2013-05-10 06:51:18

标签: python import module flask

我正在做一个烧瓶教程(http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world),我发现了一个我无法解释的行为。 本教程的主要目录结构是:

microblog
|
|---- app 
|     |---- __init__.py
|     |---- views.py  
|
|---- flask  
|---- run.py

并且文件的内容是:

微博/ run.py

#!flask/bin/python

from app import app
app.run(debug=True)

微博/应用/的初始化的.py

from flask import Flask
app = Flask(__name__)
from app import views 

微博/应用/ views.py

from app import app

@app.route("/")
@app.route("/index")

def index():
    return "Hello World!"

一切正常但如果我转换这两行:

app = Flask(__name__)
from app import views
在views.py中

然后执行run.py我得到:

  

ImportError:无法导入名称应用

为什么会这样?

2 个答案:

答案 0 :(得分:1)

因为您尝试从新创建的变量app导入。如果要导入变量模块,请使用importlib包:

my_module = importlib.import_module(app, 'view')

答案 1 :(得分:1)

与其他答案所说的相反,这是一个循环导入问题。 app.__init__尝试导入app.views,尝试导入app.app中创建的Flask app.__init__。如果在Flask导入app.__init__之前创建app.views,则app.views会找到app.app。如果在导入后创建了Flask,那么当app.views尝试找到它时,它就不存在了。

循环进口会引发各种可怕的问题。这可能很困难,但处理它们的最佳方法通常是重新组织代码,以便不进行循环导入。