FastAPI 找不到我的 Python 包。看起来相对明显的是,这是 Python 路径和导入的问题,但我不知道如何修复它。
令我惊讶的是,当使用 Flask 而不是 FastAPI 时,这有效。我将一个小型应用程序从 Flask 转换为 FastAPI,此时导入语句不再能够找到我的 Python 包。
我对 FastAPI-cli 的了解还不够,无法理解它对路径做什么/不做什么,也不知道如何修复它。
这是一个非常简单的 MWE。
# /fastapi/fastapi_mwe.py
from fastapi import FastAPI
from pydantic import BaseModel
from my_package import my_value
print(f'__name__={__name__}')
app = FastAPI()
class FastAPI_Value(BaseModel):
value: int
@app.get('/')
def root(fastapi_value: FastAPI_Value):
next_value = fastapi_value.value + my_value
return {
'next_value': next_value
}
# /my_package/__init__.py
my_value = 1
这是项目结构:
stack_overflow_mwe/
my_package/
__init__.py
fastapi/
fastapi_mwe.py
这是我跑步的方式
fastapi_mwe.py
:
user@host:/home/user/stackoverflow_mwe/$ fastapi dev fastapi/fastapi_mwe.py
ModuleNotFoundError: No module named `my_package`
我应该如何构建这个项目以及如何解决这个问题?我真的不想将包
my_package
放入子目录fastapi
,因为这个包应该完全独立于fastapi包装器/网络服务器。我应该能够创建一个名为 flask_api
的新子文件夹,并能够从两个位置导入 my_package
。
我也尝试避免使用
.venv
和可编辑安装 + pyproject.toml
。我正在使用虚拟环境来管理依赖项(例如,我使用 pip3 install fastapi
将 fastapi 包安装到本地 .venv
中)。如果没有其他选择,那么我可以创建一个 pyproject.toml
并将本地软件包设置为可编辑安装,但除非没有其他选择,否则我真的不想这样做。
您在
/home/user/stackoverflow_mwe
中运行它,代码中的命令 os.getcwd()
告诉我它确实在这个文件夹中运行它 - 所以它应该可以工作。
但也许
flaskapi
会从 sys.path
中删除当前文件夹(可能出于安全原因),并且可能需要在 sys.path.append('.')
之前添加 import
才能再次工作。
但是,如果您打算从不同的文件夹运行它(或者为了确保它在您不小心从其他文件夹运行时能够正常工作),您可以添加完整路径
import sys
#sys.path.append('.')
sys.path.append('/home/user/stackoverflow_mwe')
from my_package import my_value
确保:
/home/user/stackoverflow_mwe
,而不是/home/user/stackoverflow_mwe/my_package