根本原因是当前Python环境安装的包名与import语句中写的模块名字符串不匹配,因Python严格按字面量区分大小写且PyPI包名多为小写,如装了requests却写import Requests就会报错。

为什么 import 有时找不到明明已安装的包?
根本原因不是 Python 本身不区分大小写,而是你当前环境里实际安装的包名和你写的 import 语句不匹配——比如系统里装的是 requests(全小写),但代码里写了 import Requests 或 import REQUESTS,就会报 ModuleNotFoundError: No module named 'Requests'。
Python 的 import 机制严格按字符串字面量匹配模块名,而绝大多数 PyPI 包注册名都是小写(PEP 503 规定),但用户手动安装时可能用错大小写,或从非标准渠道复制了错误的导入写法。
- 检查真实安装名:运行
pip list,注意列出来的名字,不是你“以为”的名字 - 别信文档截图里的大小写——有些旧教程或 Stack Overflow 答案会写错,比如把
beautifulsoup4写成BeautifulSoup4 -
pip install命令本身对大小写不敏感(会自动标准化),但import语句永远敏感
如何快速确认模块名与导入名是否一致?
最可靠的方式是直接查 site-packages 目录下生成的文件夹名,它就是 Python 实际加载时找的模块名。
执行以下代码就能看到当前环境中所有可 import 的顶层模块名:
python -c "import sys; print('\n'.join(sorted(set([x.split('.')[0] for x in sys.modules.keys()]))))"
或者更直观地看已安装包的真实名称:
pip show
如果不确定,就用通配符搜索:
pip list | grep -i requests
输出类似 requests 2.31.0,那就只能用 import requests,其他大小写变体都会失败。
- 不要依赖 IDE 自动补全——它可能缓存了旧项目里的错误导入历史
- 虚拟环境之间不共享
site-packages,换环境后必须重新验证 - 某些包(如
PyYAML)安装后模块名为yaml,不是PyYAML;python-dotenv导入时用dotenv—— 这类映射关系必须查官方文档或源码__init__.py
CI/CD 或多平台部署时怎么避免大小写陷阱?
Linux 和 macOS 文件系统默认区分大小写,Windows 默认不区分,但 Python 导入逻辑在所有平台都统一按字符串匹配。这意味着你在 Windows 上侥幸跑通的 Import Django,到了 Linux CI 里必然失败。
- CI 脚本里加一行校验:
python -c "import requests" || (echo "import name mismatch for requests"; exit 1) - 用
pipdeptree --warn silence检查依赖树中是否存在大小写混用的包(比如同时存在requests和Requests) - 团队内统一用
pip install --no-cache-dir安装,避免 pip 缓存导致的命名覆盖干扰 - 如果用
requirements.txt,确保里面写的包名和pip list输出完全一致(包括连字符、下划线、数字位置)
遇到 ImportError 但 pip list 显示已安装怎么办?
先排除路径问题:确认你运行 pip 和运行 Python 脚本用的是同一个解释器。常见误操作是用系统 Python 的 pip 安装,却用 virtualenv 里的 python 执行脚本。
执行这两行命令对比:
which pip<br>which python
如果路径不一致,就用对应解释器的 pip:
python -m pip install requests
再验证导入:
python -c "import requests; print(requests.__version__)"
- 不要用
sudo pip install,容易污染系统 site-packages,且权限混乱时大小写错误更难排查 - 某些包(如
tensorflow)有多个子模块,但主导入名仍是小写tensorflow,而非TensorFlow—— 错误大小写会导致部分子模块看似能导入,实则后续调用失败 - 如果你在 Jupyter 中调试,重启 kernel 后记得重新运行
!pip install,否则新安装的包不会被识别
真正麻烦的从来不是大小写本身,而是不同环境、不同安装方式、不同文档来源之间形成的命名“方言”。每次怀疑时,别猜,直接 pip show 看真实名字。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











