mypy对已安装的缺失存根包为何返回不同错误信息?
为啥mypy对两个已安装的包报错不同?
这问题其实是mypy的模块检查逻辑导致的,我给你一步步拆解清楚:
核心原因:mypy的两步式导入检查
mypy处理导入语句时,会按顺序做两件事:
- 先定位模块本身的代码文件(比如
.py或.pyc) - 如果成功找到模块,再检查是否有对应的类型存根文件(
.pyi,用来提供类型注解信息)
两种错误提示,正好对应了这两步中不同的失败场景:
1. flask_sqlalchemy的报错:"No library stub file for module 'flask_sqlalchemy'"
mypy已经成功找到了flask_sqlalchemy的实际代码(毕竟你已经通过pip3安装了),但在typeshed或者你的项目目录里找不到它的存根文件——正如你所说,截至2019年1月它确实没有官方存根。所以mypy跳过了“找不到模块”的阶段,直接提示你缺少类型存根。
2. flask_api的报错:"Cannot find module named 'flask_api'"
这说明mypy连flask_api的实际代码都没找到,还没走到检查存根的那一步。常见原因有这些:
- mypy的搜索路径和Python运行时的
sys.path不一致:比如你用了虚拟环境,但运行mypy时没激活环境;或者pip3把包装到了用户目录(比如~/.local/lib/pythonX.Y/site-packages),但mypy没读取到这个路径。 - (不过大概率不是这个)包的导入名和PyPI包名不一致:确认过
flask-api这个包的导入名确实是flask_api,这点没问题。
怎么解决?
- 先确认
flask_api的安装位置:运行这条命令找到包的路径:
然后把这个路径所在的python3 -c "import flask_api; print(flask_api.__file__)"site-packages目录添加到mypy配置里:比如在项目根目录创建mypy.ini,加上:[mypy] pythonpath = /path/to/your/site-packages - 忽略缺失存根/导入的错误:如果暂时不需要对这两个包做类型检查,可以在
mypy.ini里针对性设置:[mypy-flask_api,flask_sqlalchemy] ignore_missing_imports = True - 手动添加存根:如果需要类型支持,可以自己写简单的存根文件(比如在项目里创建
flask_api.pyi和flask_sqlalchemy.pyi,里面写from typing import Any; __all__ = []这类占位内容),或者等待社区提供官方的types包(现在可能已经有了,但2019年的时候确实没有)。
内容的提问来源于stack exchange,提问作者user208685
相关产品推荐
相关产品推荐

