我该怎么做;“从目录导入外部目录”;在Python中工作?

我该怎么做;“从目录导入外部目录”;在Python中工作?,python,flask,Python,Flask,我将按照本教程使用Python2.7在Flask中构建一个用户登录系统 我有这个烧瓶应用程序结构 flaskapp/ └── app/ ├── user/ │ ├── __init__.py │ ├── static/ │ ├── templates/ │ ├── forms.py │ ├── routes.py └── runser

我将按照本教程使用Python2.7在Flask中构建一个用户登录系统

我有这个烧瓶应用程序结构

flaskapp/
└── app/
        ├── user/
        │      ├── __init__.py
        │      ├── static/
        │      ├── templates/
        │      ├── forms.py
        │      ├── routes.py
        └── runserver.py
在教程中,它让我编辑此文件

app/intro_to_flask/routes.py
在该文件中,您拥有此代码

from user import app
from flask import render_template, request, flash
from forms import ContactForm
from flask.ext.mail import Message, Mail

mail = Mail()
.
.
.
# @app.route() mappings start here
我得到这个错误

ImportError: cannot import name app
也就是说,我不能从用户导入应用程序。我试过:

from . import app
我真的不知道如何在这里解释这个问题,但我正在用户目录中编辑一个python文件,该文件正试图在自身内部导入一个外部目录?如果应用程序目录不在用户目录中,如何从用户导入应用程序?我错过了什么

在runserver.py中,我能够做到这一点,因为我假设runserver.py位于app目录中。但我不能在routes.py中完成

如果无法导入应用程序,则无法在Flask中定义路由:

@app.route('/')
def index():
    return "Testing route!"

在您链接到的教程中,
app
\uuuuu init\uuuuuuu.py
文件中定义,如下所示:

from flask import Flask

app = Flask(__name__)
# ... The tutorial has a lot more below this, too - it's all probably important.
模块中名为
app
的变量(本教程中名为
intro\u to\u flask
,本例中名为
user
)与名为
app
的文件夹无关


\uuuu init\uuuu.py
中有正确的内容,我认为这会解决问题。

这是您理解Python打包和导入系统如何工作的一个问题(据我所知)。您参考的教程使用了更简单的结构(所有内容都包含在两个文件中)

我会将您的结构简化为一个包含多个文件(模块)的包(文件夹)。以下是导入的工作原理

from x import y
的意思是“从[此模块或包]导入[某物]”

模块=文件

一个包=一个文件夹(其中包含
\uuuu init\uuuu.py
文件**必需)

您不能让一个模块从它无法到达的模块导入某些内容。(即找不到的包)

您也不能有循环导入。例如:

from x import y
a = 1

# ... and then inside x.py

from z import a
不行


希望这能帮助您解决导入问题的具体细节。

在这里回答我自己的问题

问题是进口的顺序。我使用一个流行的IDE,名为PyCharm,它遵循PEP8标准。它在重构期间将导入放在文件的顶部,这导致应用程序在导入时失败

这是重构的init.py文件(PEP 8)的原始代码:

修复该问题的正确代码:

from flask import Flask

app = Flask(__name__)

app.secret_key = 'development key'

app.config["MAIL_SERVER"] = "smtp.gmail.com"
app.config["MAIL_PORT"] = 465
app.config["MAIL_USE_SSL"] = True
app.config["MAIL_USERNAME"] = 'removed'
app.config["MAIL_PASSWORD"] = 'removed'

from routes import mail
mail.init_app(app)

import user.routes

@g、 华盛顿特区-我不相信这是重复的。这个问题与相对进口关系不大。所讨论的变量实际上需要在
\uuu init\uuuu.py
中定义,我怀疑它被省略了,或者使用了与本教程不同的名称。我认为导入在其他方面是正确的;在脚本中的失败行之前打印(用户)。把它打印出来的东西贴在这里-可能会让我们对正在发生的事情有更多的了解。@ArtOfWarfare:好的。。。因此,它导入了正确的文件(对吗?或者是指向一个不相关但名称类似的项目的路径?)我又开始怀疑问题出在您的
\uuuu init\uuuuuy.py
文件上。你能把你的问题编辑成包含
\uuuu init\uuuuuuy.py
的全部内容吗?我想出来了。实际上是进口的顺序造成了问题。我使用PyCharm IDE,它将导入放在init.py文件的顶部。如果您想查看,我将在下面提供一个答案。我的init.py文件确实包含Flask模块,并定义app=Flask(name)。它仍然无法从用户内部导入应用程序。谢谢ArtOfWarfare。从技术上讲,init.py文件没有正确的内容是正确的。我会在这里给你正确的答案,因为这让我按照进口的顺序找出了问题所在。我想这只是一个小疏忽,但我还是个傻瓜。啊,你说得对。我猜它正在尝试从init.py文件导入app,其中定义了app=Flask()。如何将app=Flask()从init.py导入routes.py文件?
从intro\u导入到\u Flask导入app
,这就是问题所在。从intro_到_flask导入应用程序无法在routes.py中导入应用程序,即使intro_到_flask中的init.py文件已将应用程序定义为app=flask(),很高兴您能找到它。这是循环导入的情况,这个问题通常在Python中出现。
from flask import Flask

app = Flask(__name__)

app.secret_key = 'development key'

app.config["MAIL_SERVER"] = "smtp.gmail.com"
app.config["MAIL_PORT"] = 465
app.config["MAIL_USE_SSL"] = True
app.config["MAIL_USERNAME"] = 'removed'
app.config["MAIL_PASSWORD"] = 'removed'

from routes import mail
mail.init_app(app)

import user.routes