【问题标题】:Python 3 - Cannot make relative imports to flask server application created in virtualenvPython 3 - 无法对在 virtualenv 中创建的烧瓶服务器应用程序进行相对导入
【发布时间】:2017-08-15 10:27:35
【问题描述】:

我将FLASK_APP 设置为api.py,然后运行flask run,但随后 我收到错误 SystemError: Parent module '' not loaded, cannot perform relative import 。 PyCharm 没有任何错误,这证实了在语法上这是正确的。

api.pi

from . import models 
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello, Welcome to the API!'
if __name__ == '__main__':
    app.run()

目录结构

           ├── ProjectDirectory
           │    ├── flask-api
           │    │   ├── venv
           │    │   ├── api.py
           │    │   └── models.py
           │    ├── modelpackage
           │    │   ├── __init__.py
           │    │   ├── classA.py
           │    │   ├── classB.py
           │    │   ├── helpers.py
           │    │   └── simplescript.py

正如您在上面看到的,api.pymodels.py 都在同一个目录中,使用 from . import models 行应该将脚本的代码导入到 api.py 中。作为参考,这个 Flask 服务器是使用 virtualenv 制作的,遵循官方 Flask 文档,因此在 flask-api 目录中有一个 venv 目录。

另外,models.py 进一步从modelpackage 导入内容,这就是为什么我将其包含在上面以保持完整性。

这是否与 Flask/VirtualEnv/Directory 结构有关?

【问题讨论】:

    标签: python flask virtualenv python-import


    【解决方案1】:

    当模块用作主模块时,它的名称是 __main__ 。所以相对进口不起作用。您应该使用绝对导入。 IE from flask_api import models

    这里是更多信息的链接Documentation

    请注意,相对导入基于当前模块的名称。由于主模块的名称始终为“ma​​in”,因此用作 Python 应用程序主模块的模块必须始终使用绝对导入。

    注意:根据 PEP8 使用绝对导入而不是相对导入。

    【讨论】:

    • 其实我从你的回答中意识到我忘记添加__init__.py
    • 是的。这会起作用,但当当前模块的名称是 __main__ 时不起作用
    猜你喜欢
    • 2016-04-05
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    相关资源
    最近更新 更多