Python导入问题:如何让FastAPI项目中main.py与blog_get.py正常运行?
FastAPI项目导入问题解决与机制解析
一、让main.py和blog_get.py都正常运行的两种方案
方案1:统一从项目根目录启动模块
- 运行main.py:在项目根目录执行
python main.py - 运行blog_get.py:在项目根目录执行
python -m router.blog_get
这里的-m参数会把router.blog_get当作包的子模块加载,Python会自动将项目根目录加入sys.path,匹配你的绝对导入语句。
方案2:修改sys.path适配直接运行
在blog_get.py开头添加以下代码,手动将项目根目录加入Python的搜索路径:
import sys from pathlib import Path # 动态获取项目根目录(router目录的父级就是根目录) sys.path.append(str(Path(__file__).parent.parent)) # 之后正常使用绝对导入 from router.blog_posts import required_functionality
这样不管是从根目录运行main.py,还是直接运行blog_get.py,导入都能生效。
二、你对Python导入的核心误区
脚本运行与模块导入的上下文差异
- 直接运行
blog_get.py时,它是顶层脚本,Python默认把脚本所在的router/目录加入sys.path,此时找不到router.blog_posts(因为router目录本身就在搜索路径里,相当于要找router/router/blog_posts)。 - 运行
main.py时,项目根目录被加入sys.path,router是根目录下的包,所以router.blog_posts能被正确识别。
- 直接运行
混淆了直接运行与包模块运行的区别
- 用
python xxx.py运行文件时,文件是独立脚本;用python -m 包.模块运行时,模块是包的一部分,此时Python会以项目根目录为基准加载模块,符合绝对导入的逻辑。
- 用
相对导入的使用限制
- 相对导入(比如
from .blog_posts import ...)只能在被当作包的一部分导入时使用,不能在直接运行的脚本里用。如果直接运行脚本时用相对导入,Python会认为它没有父包,从而报错。
- 相对导入(比如
内容的提问来源于stack exchange,提问作者Ray Santiago
相关产品推荐
相关产品推荐

