【问题标题】:Flask Bug on Python 3.4? Development server can't run if app contains relative importsPython 3.4 上的烧瓶错误?如果应用程序包含相对导入,则开发服务器无法运行
【发布时间】:2015-05-19 09:39:00
【问题描述】:

根据设计,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 python-3.x flask werkzeug relative-import


    【解决方案1】:

    这可能是由于重新加载器的工作方式。如果您以意想不到的方式执行某些操作,例如直接调用内部模块来运行应用程序,它往往会混淆 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,了解有关重新加载器为何出现某些模式问题的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-09
      • 2020-04-16
      • 1970-01-01
      • 2016-04-05
      • 2016-12-23
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      相关资源
      最近更新 更多