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 以了解有关重新加载器为何无法处理某些模式的更多信息。
根据设计,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 以了解有关重新加载器为何无法处理某些模式的更多信息。