FastAPI 没有名为“我的模块”的模块 - FastAPI 找不到我的 Python 包

问题描述 投票:0回答:1

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
并将本地软件包设置为可编辑安装,但除非没有其他选择,否则我真的不想这样做。

python fastapi
1个回答
0
投票

您在

/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

© www.soinside.com 2019 - 2024. All rights reserved.