FastAPI:"ImportError:尝试进行相对导入,但找不到已知的父包"。

10

我是FastAPI的新手,遇到了导入其他文件的问题。

我遇到了以下错误:

from . import schemas
ImportError: attempted relative import with no known parent package

提供一些上下文,我要导入的文件是一个名为“Blog”的文件夹。我看到某些StackOverflow答案说,应该写成from Blog import schemas而不是from . import schemas。虽然他们的解决方案是正确的,并且在运行Python程序时我没有收到任何错误,但当我尝试使用uvicorn运行FastAPI时,我会遇到这个错误,我的本地主页无法加载。

  File "./main.py", line 2, in <module>
from Blog import schemas
ModuleNotFoundError: No module named 'Blog'

文件结构如下所示: enter image description here 主文件的代码如下:
from fastapi import FastAPI
from Blog import schemas, models
from database import engine

app = FastAPI()

models.Base.metadata.create_all(engine)


@app.post('/blog')
def create(request: schemas.Blog):
    return request

schemas.py

from pydantic import BaseModel


class Blog(BaseModel):
    title: str
    body: str

database.py

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHAMY_DATABASE_URL = 'sqlite:///./blog.db'

engine = create_engine(SQLALCHAMY_DATABASE_URL, connect_args={"check_same_thread": False})

SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)

Base = declarative_base()

models.py

from sqlalchemy import *
from database import Base


class Blog(Base):
    __tablename__ = 'blogs'
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String)
    body = Column(String)

SwaggerUI也无法加载。

非常感谢您的帮助!:)


嗨,Chris,我已经按照上面提到的做完了所有这些。但我仍然遇到同样的错误<b>ModuleNotFoundError: No module named 'Blog'</b>。 - Rohit Varma
@Chris 我已经编辑了我的问题,并在那里发布了所有的代码以及文件结构。 - Rohit Varma
3个回答

12
你还可以从上面的文件夹中运行你的应用程序。例如,如果你使用uvicorn,你可以执行以下操作
uvicorn folder.app:main --reload

替代

uvicorn app:main --reload

那么你可以保留这个点。


为什么他要运行 [...] main:app?FastAPI的语法与在常规Python模块中导入相同。"from main import app" 等同于这部分 " main:app "。所以你所说的只有在他有一个名为 "app" 的模块且FastApi对象是main时才能起作用。https://fastapi.tiangolo.com/deployment/manually/ - enjoi4life411
因为这是从命令行运行uvicorn的语法?不确定我是否理解你的意思。即使在你提供的链接网站中也有展示。 - Matthias
1
我评论的第一部分本来应该说“为什么他要运行 '... app:main'”。看看你提出的语法。是不正确的。OP 有一个名为 "main.py" 的模块,其中包含变量 "app"。你的建议是他有一个名为 "app.py" 的模块,并且有一个变量 "main"。 - enjoi4life411
1
哦,你说得对,眼力真敏锐,我会修改答案的。 - Matthias

7

由于您的schemas.pymodels.py文件与main.py文件在同一目录中,因此您应该按照以下方式导入这两个模块,而不是使用from Blog import schemas, models

import schemas, models

欲了解更多详情和示例,请参考此答案,以及此答案此答案


2

这对我很有帮助(不带点号):

from models import User
## instead of 
# from .models import User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接