--no-deps 不能跳过所有依赖,仅跳过 setup.py 或 pyproject.toml 中声明的依赖安装,无法规避运行时 import 失败、abi 不兼容或系统级库(如 libcudart.so)缺失等问题;适用于已手动安装兼容依赖、离线部署、ci/cd 锁定底层 c 库、容器镜像精简及调试依赖冲突等场景。

直接用 --no-deps 安装包却不处理依赖,大概率导致 ImportError 或 ModuleNotFoundError —— 这不是 pip 的 bug,而是你跳过了它本该干的活。
什么时候必须加 --no-deps?
常见于以下场景:你已经通过其他方式(如 conda、系统包管理器、或提前编译好的 wheel)安装了特定版本的依赖,而 pip 默认会覆盖它们;或者你要在离线环境中分步部署,先装主包再手动校验依赖版本。
- CI/CD 中需锁定底层 C 库版本(比如
numpy依赖的 OpenBLAS 版本),避免 pip 自动升级破坏 ABI 兼容性 - 容器镜像构建时,为减小体积或规避网络问题,先
pip install --no-deps mypkg,再用apt-get install python3-mypkg-deps - 调试依赖冲突时,用
--no-deps快速验证是否真是某个间接依赖引发的问题
--no-deps 后怎么补依赖?
不能靠猜,得从源码或包元数据里找真实依赖项。最可靠的方式是查 setup.py 或 pyproject.toml 中的 install_requires 字段,而不是看 PyPI 页面上“Dependencies”栏 —— 那个常是解析后的结果,可能含条件依赖(如 typing-extensions; python_version)。
- 用
pip show mypkg查已安装包的Requires字段(注意:仅对已成功安装的包有效,且不反映条件逻辑) - 用
python -m pip download --no-deps mypkg下载 sdist/wheel 后解压,直接读setup.cfg或pyproject.toml - 对现代项目,优先运行
pip install build,然后python -m build --wheel --no-isolation构建后用python -m wheel unpack检查 METADATA 文件
为什么 pip install --no-deps 有时仍报错?
因为某些包在 setup.py 的 install_requires 里没写,却在 import 时动态加载 —— 比如通过 pkg_resources 或 importlib.metadata 查询入口点,或运行时调用 subprocess.run(["git"]) 这类外部命令。这类依赖不会出现在 pip show 输出里。
- 典型例子:
black不声明click为硬依赖(因用了extras_require),但没它就起不来 - 运行前先执行
python -c "import mypkg; mypkg.__main__.main()",比直接pip install更早暴露缺失模块 - 用
strace -e trace=openat,open,stat python -c "import mypkg"(Linux)可捕获所有 import 尝试路径,定位真正缺什么
手动处理依赖的本质不是绕过 pip,而是把隐式决策显式化 —— 你得自己判断哪些依赖必须装、装哪个版本、是否要加 --force-reinstall 或 --no-cache-dir。最容易被忽略的是环境变量影响:比如 PYTHONPATH 干扰了 import 路径,让你误以为缺依赖,其实只是模块没被发现。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











