2

根据设计,Python 3不能将包含相对导入的模块作为脚本运行。尝试这样做会产生以下错误:

$ 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

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

4

1 回答 1

4

这可能是由于重新加载器的工作方式。如果您以意想不到的方式执行某些操作,例如直接调用内部模块来运行应用程序,它往往会混淆 Python 路径。

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

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

run.py从目录执行my_project(或以其他方式放在my_projectPython 路径上)。这将非常简单,例如:

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

有关重新加载器为何在某些模式上出现问题的更多信息,请参阅此问题。

于 2015-03-17T15:40:34.133 回答