【发布时间】:2018-12-07 10:23:53
【问题描述】:
我有一个具有以下布局的 python 模块:
foo
| __init__.py
| __main__.py
| bar.py
__init__.py 为空。
foo/bar.py的内容:
from flask import Flask
app = Flask(__name__)
def baz(): pass
运行python3 -m foo 时,我得到令人困惑的结果。
foo/__main__.py的内容
# Results in a ModuleNotFoundError: No module named 'foo'
from foo.bar import app
app.run()
# Raises no error and correctly prints the type
from foo.bar import app
print(type(app))
# Also runs without an error
from foo.bar import baz
baz()
为什么可以从这个模块导入和执行一个函数,但是当尝试对一个烧瓶应用程序做同样的事情时,它会导致ModuleNotFoundError?
我只是看不出这有什么意义。
编辑:
即使使用此代码,错误仍然存在:
from foo.bar import app
print(type(app))
app.run()
输出:
<class 'flask.app.Flask'>
* Serving Flask app "foo.bar" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
Traceback (most recent call last):
File "/home/user/projects/ftest/foo/__main__.py", line 1, in <module>
from foo.bar import app
ModuleNotFoundError: No module named 'foo'
所以,显然模块可以被导入,因为type(app) 工作得很好并且烧瓶确实启动了。似乎烧瓶重新加载并以某种方式处理导入。
编辑 2:
我关闭了调试模式,它工作得很好。
仅当您设置export FLASK_DEBUG=True 或通过app.config["DEBUG"] = True 显式启用调试时才会出现此错误
【问题讨论】:
-
我重新创建了您的项目,但没有看到错误,在您的代码中也看不到任何原因。您确定这是您使用的代码和布局吗?您的
__init__.py是空的还是包含代码?你从哪里运行命令? -
re “为什么可能”:Flask 对这个论点做了一些特别的事情;例如,如果我执行
app = Flask("qux.baz"),我会失败,因为模块qux不存在。所以我的猜测是,要么你传递了一些奇怪的东西,要么可能是一些乱七八糟的东西,比如你剩下的__pycache__不知何故被一个坏名字锁定了...... -
@matejcik:
__init__.py为空,我更新了问题以添加此信息。我正在运行上面目录中的代码。我清理了__pycache__,但没有帮助。我根本没有做任何奇怪的事情,因为帖子中的内容实际上是模块中的所有代码。 -
当您执行第一个
__main__.py代码时,您确定您在正确的目录中吗? (也许在顶部添加import os;print(os.getcwd())以检查) -
@PRMoureu 都是从同一个目录执行的。
标签: python-3.x flask module