Python 3.4 上的 Flask Bug?如果应用程序包含相关导入,开发服务器不能 运行

Flask Bug on Python 3.4? Development server can't run if app contains relative imports

根据设计,Python 3 cannot run 一个包含相对导入作为脚本的模块。尝试这样做会产生以下错误:

$ python mypackage/run.py
[...traceback...]
SystemError: Parent module '' not loaded, cannot perform relative import

解决方案是使用 python -m mypackage.run 调用模块,而不是更熟悉的 python mypackage/run.py

在 Flask 中,后者通常是运行开发服务器的方式。但是,Flask 开发服务器会立即生成一个重新加载代码的子进程(并随后在磁盘上的文件发生更改时重新加载代码)。

结果是这样的:

$ python -m mypackage.run
 * Running on http://127.0.0.1:5000/
 * Restarting with reloader
[...traceback...]
SystemError: Parent module '' not loaded, cannot perform relative import

所以现在服务器正常启动,但是子进程重新加载代码不正确。

这可能是由于重新加载器的工作方式所致。如果您以意想不到的方式做某事,例如直接调用内部模块到 运行 应用程序,它往往会弄乱 Python 路径。

run.py 完全移出您的项目。它只在开发中有用,因为生产部署将直接使用应用程序而不是开发服务器。

/my_project/
    /run.py
    /my_package/
        /__init__.py
        /my_module.py

my_project 目录执行 run.py(或者将 my_project 放在 Python 路径上)。这将非常简单,类似于:

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

请参阅 this issue 以了解有关重新加载器为何无法处理某些模式的更多信息。