【问题标题】:FastAPI call file from same level, but in different directory同一级别的 FastAPI 调用文件,但在不同的目录中
【发布时间】:2021-02-26 22:26:09
【问题描述】:

我在从另一个目录(同一级别只是不同的目录)导入我的文件时遇到问题。

我的模型目录位于 ./models 中,其中包含我的 personModel.py 文件,该文件具有我的 BaseModel 定义

personModel.py

class Person(BaseModel):
  name: str
  age: int

我想将它调用到包含我的 person.py 文件的 ./routes 中。我这样做并没有工作,因为它不是来自同一个目录

Person.py

from personModel import Person

我应该怎么做?谢谢

编辑(树结构):

api
└── model
    └── personModel.py
└── routes
    └── Person.py

所以,两个路径是 project/backend/api/model/personModel.py 和 project/backend/api/routes/Person.py

【问题讨论】:

  • 尝试使用from models.personModel import Person导入,访问文件前需要添加模块命名空间。
  • 我已经编辑了我的树,希望可以更清晰?
  • 我已经尝试了你的建议并得到了ERROR: Error loading ASGI app. Could not import module "personModel"
  • Tnx 为树,看看这个:stackoverflow.com/a/66393809/8488594

标签: python api fastapi


【解决方案1】:

正如我在更新的树结构中看到的那样,您需要将 __init__.py 文件添加到 modelroutes 目录中,因此 python 将它们视为 python 模块。
然后我在评论中提到的导入将正常工作:

api
└── __init__.py
└── model
    └── __init__.py
    └── personModel.py
└── routes
    └── __init__.py
    └── Person.py
from model.personModel import Person

【讨论】:

  • 我现在正面临这个错误:ModuleNotFoundError: No module named 'models'
  • 来自model.personModel,我原来的回答也犯了同样的错字
  • 很奇怪,我改了还是一样的错误:ModuleNotFoundError: No module named 'model'
  • @unaturatedgoods 将__init__.py 添加到api 文件夹并重试g
【解决方案2】:

我通常尝试遵循的一条规则是始终声明从根目录开始的路径(即,无论您在何处创建 FastAPI“应用程序”对象)。它确实有助于让我保持井井有条并消除相对进口的混乱。您的 ma​​in.py 文件应该是您的“根”文件。如果您要使用 pytest 或 async-pytest,这也会有所帮助,因为我过去曾遇到过这样的问题。

from api.model.personModel import Person

应该为你做这件事,因为没有其他奇怪的事情发生。请记住,文件导入将与作为应用程序根目录的任何文件相关(同样,任何文件都有您的“应用程序”创建)。

【讨论】:

  • 模块中缺少__init__.py文件,添加api前缀只会污染导入语句。
  • 这不起作用,我之前确实有 __init.py__ 文件,所以我很困惑为什么它不起作用。
  • 我假设你已经有了这些。你在 ./api 中也有 __init__.py 吗?
  • 我愿意,我现在面临ModuleNotFoundError: No module named 'model' 这个(顺便说一句,我正在做from model.personModel import Person
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 2018-03-26
  • 2012-10-08
  • 1970-01-01
相关资源
最近更新 更多