Poetry配置FastAPI启动脚本报No file/folder found错误
问题根因
这个报错和你写的脚本入口路径没有关系,是Poetry的默认包扫描规则和你的目录结构不匹配导致的:
- 你的pyproject.toml中项目名设置为
backend,Poetry默认会自动扫描两个位置的代码包:项目根目录下和项目同名的backend文件夹、标准src布局下src/backend文件夹。你当前的目录结构里这两个位置都不存在,Poetry在安装项目、生成脚本入口的阶段就找不到要关联的项目包,直接抛出No file/folder found for package backend错误,根本走不到执行你配置的入口函数那一步。 - 你直接执行
poetry run python asgi.py能正常启动,是因为这个命令直接把asgi.py当作独立脚本运行,走文件内if __name__ == "__main__"的逻辑,完全跳过了Poetry的包扫描和脚本生成流程,自然不会触发这个报错。 - 另外你之前写的
asgi:__main__入口本身也是错误配置:Poetry scripts要求冒号后面是可被导入调用的Python对象,__main__是脚本直接执行时的模块名标识,不是可以被导入调用的函数/类。
解决方法
二选一即可:
方案1:调整为标准项目结构(长期维护推荐)
把代码整理为Poetry默认识别的src布局,调整后目录结构如下:
├── backend ├── src │ └── backend │ ├── __init__.py │ └── asgi.py ├── Dockerfile ├── poetry.lock └── pyproject.toml
- 在
asgi.py中添加显式的启动函数,不要依赖__main__判断:# asgi.py 示例 from fastapi import FastAPI import uvicorn app = FastAPI() # 原有路由、依赖等代码保持不变 def main(): uvicorn.run("backend.asgi:app", host="0.0.0.0", port=8000) - 修改pyproject.toml的scripts配置:
[tool.poetry.scripts] foo = "backend.asgi:main" - 在项目根目录执行
poetry install重新安装项目、生成脚本入口,之后执行poetry run foo即可正常启动。
方案2:不调整目录,手动指定包扫描规则
如果你不想改动现有目录结构,直接在pyproject.toml中显式告诉Poetry要识别的代码文件即可:
- 修改pyproject.toml,在
[tool.poetry]段添加packages配置,同时修正scripts入口:[tool.poetry] name = "backend" version = "0.1.0" description = "" authors = ["Pierre-Alexandre35 <46579114+pamousset75@users.noreply.github.com>"] readme = "README.md" # 新增下面配置,明确告诉Poetry要把根目录的asgi.py纳入包 packages = [{ include = "asgi.py" }] # 其他依赖配置保持不变 [tool.poetry.scripts] foo = "asgi:main" - 和方案1一样,在asgi.py中添加可调用的
main启动函数,注意把uvicorn.run的模块路径改成asgi:app即可。 - 执行
poetry install刷新配置后,再运行poetry run foo即可正常启动。
注意事项
- 每次修改pyproject.toml的包配置、scripts配置后,必须重新执行
poetry install,否则新配置不会生效。 - 不要在scripts入口中写
__main__、.这类不符合规范的值,必须指向明确可导入的Python可调用对象。
内容的提问来源于stack exchange,提问作者Pierre-Alexandre35
相关产品推荐
相关产品推荐

