【问题标题】:Python: Unable to import modulePython:无法导入模块
【发布时间】:2019-05-19 23:01:47
【问题描述】:

我正在向https://blog.miguelgrinberg.com/学习flask

我有一个文件名为 microblog.py 的应用微博

from app import app

我有一个名为app 的目录,它包含__init__.py 和下面的代码

from flask import Flask
from config import Config

app = Flask( __name__ )
app.config.from_object(Config)
from app import routes

但是当我运行flask run 时,我收到了错误

ImportError: No module named 'app'

我明白,如果我想将一个目录表示为一个包,那么我必须在目录中包含一个__init__.py,我为app 目录这样做了。

目录结构

.
├── __init__.py
├── app
│   ├── __init__.py
│   ├── forms.py
│   ├── routes.py
│   └── templates
│       ├── base.html
│       ├── index.html
│       └── login.html
├── config.py
└── microblog.py

完整的堆栈跟踪


flask run                                       
 * Serving Flask app "microblog.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
Usage: flask run [OPTIONS]

Error: While importing "microblog.microblog", an ImportError was raised:

Traceback (most recent call last):
  File "~/anaconda3/envs/flask_python3.5.2/lib/python3.5/site-packages/flask/cli.py", line 235, in locate_app
    __import__(module_name)
  File "~/learning/migual_flask/microblog/microblog.py", line 1, in <module>
    from app import app
ImportError: No module named 'app'

这段代码直到最近才有效,突然开始出现问题。我无法找到哪里出了问题。

非常感谢任何帮助。

谢谢。

【问题讨论】:

  • 你能显示你的目录层次结构吗?即文件在哪里,你从哪里打电话?
  • 为什么最后一行有from app import routes%?你想做什么?
  • 可能是您的目录层次结构造成的。试试下面的链接。 stackoverflow.com/questions/22711087/… 你为什么要使用这个?:> from app import routes% 希望这对你有帮助。祝你今天过得愉快。 :D
  • @knh190,我已经更新了带有目录结构的帖子,并且该 % 符号是 cat 命令输出的一部分。
  • 你能发布完整的堆栈跟踪吗?

标签: python flask


【解决方案1】:

好的,从你发布的层次结构来看,很明显它应该可以工作,但我怀疑你是从错误的目录导入的。

给定目录:

.
├── __init__.py
├── app
│   ├── __init__.py
│   ├── forms.py
│   ├── routes.py
│   └── templates
│       ├── base.html
│       ├── index.html
│       └── login.html
├── config.py
└── microblog.py

假设您从根目录(顶部的“.”)导入它们:

$ls                                                                                                                                                        
__init__.py  app          config.py    microblog.py

$ls app
__init__.py  forms.py     routes.py

# which works
>>> import config
>>> import microblog
>>> import app

# and
>>> from app import routes
>>> from app import forms

我注意到你的app/__init__.py 中有app = Flask(),这是一个非常糟糕的做法,应该尽可能避免(是什么让你认为它很好?我想不出任何),但它为我工作:

>>> import app
>>> from app import app

# the first app is module
# the second is app = Flask()
# but the second one will overwrite the first one's name
# which is another terrible practice

你可以检查一个模块:

>>> import app
>>> help(app) # app = Flask() is there

【讨论】:

  • 我可以通过 python 控制台导入模块,但通过flask run 仍然面临同样的问题。
  • @rɑːdʒɑ 您的完整回溯显示您正在从 microblog 的类中导入模块,但您没有显示源代码。
  • 我已经在sendspace.com/file/nmic8r上传了源代码,请查收。
  • 我没有给flask run,而是给了python microblog.py,它现在可以工作了。我已经定义了一个带有应用程序名称环境变量的.flaskenv 文件。
  • @rɑːdʒɑ 您的 zip 与您的回溯完全不匹配!你想做什么?我完全迷路了。但由于我的演示清楚地展示了如何使导入工作,我将关闭此后续操作。
猜你喜欢
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2017-11-02
  • 2018-09-17
  • 2017-12-11
相关资源
最近更新 更多