Python 3 - 无法对在 virtualenv 中创建的 Flask 服务器应用程序进行相对导入

Python 3 - Cannot make relative imports to flask server application created in virtualenv

我将 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结构有关系吗?

当模块用作主要模块时,其名称为 __main__ 。因此相对导入不起作用。您应该使用绝对导入。 IE from flask_api import models

这里是link了解更多信息Documentation

Note that relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application must always use absolute imports.

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