pip 的报错信息有个特点:症状看着五花八门,根子就那么几个。这篇把平时遇到的情况归一下类,每种给一个能照着做的处理办法。场景以 Windows 为主,Linux / macOS 上不一样的地方单独点出来。
开始之前,有一条命令值得先记住,它能绕掉下面一半的麻烦:python -m pip。
先养成用 python -m pip 的习惯
直接敲 pip 和敲 python -m pip,跑的是同一份代码,区别在怎么找到解释器。
pip.exe 是装 Python 时生成的一个启动器。它内部记录了自己属于哪个解释器,通过 PATH 找到它、再由它去启动那个解释器。python -m pip 则是让当前这个 python 去加载 pip 模块,用的是哪个解释器一眼就知道。
差别就在这里:机器上装了三个 Python 的时候,裸 pip 到底指向哪一个,取决于 PATH 的顺序和谁最后改过它;而 python -m pip 永远是「我敲的那个 python 自己的 pip」。后面所有「到底装到哪个环境去了」的怪事,换成这个写法基本就不会发生。
配套记住两个诊断命令:pip -V 和 python -m pip -V。输出长这样:
pip 24.0 from C:\Users\me\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip (python 3.12)两边各敲一次,路径和 Python 版本一对比,就知道是不是同一个环境了。排查问题的时候这一步比什么都快。
一、pip 命令没了
症状是 cmd 里报 'pip' 不是内部或外部命令,PowerShell 里报 pip : 无法将「pip」项识别为 cmdlet。这个报错只说明 PATH 里找不到叫 pip 的程序,不代表 pip 坏了,更不代表要重装 Python。按下面顺序查,多数情况一分钟能解决。
第 0 步,先确认 pip 模块还在不在。 敲 python -m pip -V。如果这条正常输出版本号,说明 pip 好好的,只是 pip.exe 那个入口不在 PATH 里,看第 1 步。如果报 No module named pip,才是真的缺了,看第 2 步。
第 1 步,把 Scripts 目录加进 PATH。 pip.exe 在 Python 安装目录的 Scripts 子目录下,用官方安装包做 per-user 安装时,位置是这样:
C:\Users\<用户名>\AppData\Local\Programs\Python\Python312\
C:\Users\<用户名>\AppData\Local\Programs\Python\Python312\Scripts\ ← pip.exe 在这把 Scripts 那个目录加到用户环境变量的 PATH 里,然后重开终端。注意加到「用户变量」就够了,不用动系统变量。cmd 要重开,VS Code 里的终端也要重开——它继承的是启动那一刻的环境,不重开读不到新 PATH。
这里有个很容易忽略的情况:用 Python Install Manager 装的 Python,根本没有全局 pip 命令。 这是官方有意为之,PEP 里写明了不提供 global pip,思路是让项目依赖都待在 venv 里。所以用它装的解释器,装包要用 python -m pip,或者先激活 venv 再用 pip。你在 PATH 里怎么找都找不到 pip.exe 是正常的,不是装坏了。(这套工具的情况在另一篇里写过。)
第 2 步,pip 模块真没了,用 ensurepip 补回来。
python -m ensurepip --upgradeensurepip 从 Python 3.4 起就在标准库里,不联网就能把 pip 和 setuptools 装回去。这一步比重跑安装包快,也不会引入版本变化——所以别一上来就重装 Python。
如果 ensurepip 也失败,Linux 上常见的是发行版把 pip 拆成了独立包(报 ensurepip is disabled in Debian/Ubuntu 之类),用 apt install python3-pip 或 dnf install python3-pip 装;Windows 上走到这一步,基本可以判定这个 Python 装得有问题,用官方安装包的 Modify 修复一次是最省事的。
另外两种「命令没了」的原因也常遇到:
一是 venv 没激活。venv 里的 pip 只有激活之后才进 PATH,没激活时你敲 pip,要么找不到,要么用的是系统里另一个 Python 的 pip——后者更麻烦,它会把包装到外面去。激活命令:Windows 上是 .venv\Scripts\Activate.ps1(PowerShell)或 .venv\Scripts\activate.bat(cmd),Linux / macOS 上是 source .venv/bin/activate。PowerShell 上第一次执行可能被脚本执行策略拦住,报「禁止运行脚本」,那就先执行 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned。
二是用 pyenv-win 的话忘了 rehash。执行一次 pyenv rehash 重新生成 shim,新装的命令行工具才会出现。
二、包装到了别的环境里
症状是:pip install requests 显示成功,运行代码却报 ModuleNotFoundError: No module named 'requests';或者 pip show 说装好了,IDE 里就是找不到。
原因还是上面那条——pip 命令指向的解释器,和你跑代码用的解释器不是同一个。系统装的、pyenv 管的、venv 里的,几个 Python 任意组合都能凑出不同的错法。
处理就是别用裸 pip,先确认再装:
python -V # 先看清当前是哪个解释器
python -m pip install requestsIDE 里更要留意,PyCharm 和 VS Code 都有自己独立的解释器设置,跟系统终端不一定一致,这类问题排查起来最费时间。
顺便纠一个流传很广的说法:靠 pip3 区分环境并不可靠。 Windows 上 pip3.exe 和 pip.exe 通常就是同一份东西的两个名字,指向同一个解释器;Linux 上 pip3 一般绑 python3,但机器上若有多个 python3 也一样没辙。想明确指定环境,只能用 python -m pip 这种形式。
三、权限被拒:WinError 5
ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。:
'C:\\Program Files\\Python312\\Lib\\site-packages\\requests'看到这个,说明你在往一个没有写权限的目录里装包,典型情况是机器级安装、Python 装在 Program Files 下。这时候不要用管理员终端硬装——它会把一批文件写成管理员所有,之后普通账户再用又是一堆权限问题,属于把坑挖得更深。
正确做法有两个,优先第一个:建 venv,依赖全装在项目里。
python -m venv .venv
.venv\Scripts\activate
python -m pip install requests实在不想建虚拟环境,就装到用户目录:
python -m pip install --user requests--user 会装到 %APPDATA%\Python\Python312\site-packages,不需要管理员权限,也不去动系统目录。Linux 上对应的报错是 Permission denied,处理方式一样;如果看到的是 error: externally-managed-environment,那是 PEP 668 的提示,意思就是「别往系统 Python 里装,去建 venv」。
四、网络慢、超时、SSL 证书报错
这是三个不同的报错,处理方式不一样,别混着治。
下载慢或 Read timed out:换源。 临时用一次:
python -m pip install requests -i https://mirrors.aliyun.com/pypi/simple/每次敲太麻烦,写进配置,一次生效:
python -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/这条命令会写到用户配置文件里,Windows 是 %APPDATA%\pip\pip.ini,Linux / macOS 是 ~/.config/pip/pip.conf,不用手工去建 ~/.pip 目录。查当前生效的配置用 pip config list;想知道每个值是从哪个文件读来的,用 pip config debug——排查「我明明配了源怎么没用」的时候特别省事,企业环境里最常见的原因就是系统级配置把用户级覆盖了。
国内常用的源:
| 名称 | 地址 |
|---|---|
| 阿里云 | https://mirrors.aliyun.com/pypi/simple/ |
| 清华大学 | https://pypi.tuna.tsinghua.edu.cn/simple/ |
| 中科大 | https://pypi.mirrors.ustc.edu.cn/simple/ |
| 腾讯云 | https://mirrors.cloud.tencent.com/pypi/simple/ |
两点提醒。一是别用豆瓣源,网上老文章里的 pypi.douban.com 已经停用,现在访问会 403 或者一直超时,那些配置照抄下来会出现「换源之后反而全都报错」的效果。二是配置里的地址用 https,别用 http,老教程里满是 http://mirrors.aliyun.com/pypi/simple/ 这种写法,某些网络环境下会被 pip 拒绝或者被中间设备重定向。
SSL 证书报错:SSLError: certificate verify failed。 这个多半出现在公司网络里——出口有代理,代理用自签证书做了中间人,Python 的证书库不认它。
临时绕过,只用来确认是不是这个原因:
python -m pip install requests --trusted-host mirrors.aliyun.com但 --trusted-host 的语义是「这个域名完全不做证书校验」,只能当临时手段,别写进配置文件长期用。正规做法是把公司代理的根证书加进信任链:证书转成 pem 格式,然后
python -m pip config set global.cert C:\certs\corp-root.pem也可以用环境变量 PIP_CERT 指向这个文件。如果公司内部源是 http 地址,记得同时把 trusted-host 设成那个内部域名。
源没问题但还是超时: 加大超时和重试次数,--timeout 60 --retries 5。如果处在代理环境,检查 HTTP_PROXY / HTTPS_PROXY 环境变量有没有设对——pip 不读系统代理设置里的「例外」列表,这一点经常被忽略。
五、包装不上:编译失败和版本不匹配
最常见的报错是这个:
error: Microsoft Visual C++ 14.0 or greater is required.
Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/它的意思是:你要装的这个包,官方没有为你的 Python 版本提供预编译的 wheel,pip 只好下源码自己编译,而机器上没有 C++ 编译器。看到它的时候,第一反应不该是去装几个 GB 的 Build Tools,先确认两件事:
是不是 Python 版本太新了。 刚发布没几个月的 Python 版本,科学计算类的包常常还没出对应 wheel,这时候把 Python 降一个小版本,比装编译器省事得多。容易碰上这类的包有 numpy、pandas、lxml、psycopg2、cryptography,它们都带 C 扩展。
强制只用 wheel 试一次,能明确告诉你到底有没有可用的二进制包,而不是让 pip 闷头去编译:
python -m pip install lxml --only-binary :all:报 Could not find a version that satisfies the requirement 就是确实没有 wheel;能装上,说明刚才只是 pip 优先挑了源码包。
还可以看一下 pip 认为自己是什么平台:python -m pip debug --verbose 会列出当前兼容的 wheel 标签,对不上号的时候一眼能看出来——比如 32 位 Python 在找 64 位的包,或者 Python 3.13 在找 cp312 的包。
真到了必须编译的地步,装 Microsoft C++ Build Tools 时注意勾选「使用 C++ 的桌面开发」这个工作负载,只装运行时是不管用的。
六、卸载不干净、依赖冲突
报 ERROR: Cannot uninstall 'xxx'. It is a distutils installed project,说明这个包不是 pip 装的(可能是安装器或系统的包管理器放进去的),pip 不知道哪些文件归它管,所以拒绝动手。两个选择:加 --ignore-installed 覆盖式重装(pip 不删旧文件,直接盖上去),或者到 site-packages 里手工把目录删掉再装。前者快但可能留下残留文件,后者干净但要找对目录。
依赖冲突。pip 20.3 之后换了依赖解析器,冲突时会打印 ResolutionImpossible 和一长串版本要求。这个报错看着吓人,其实比老版本的行为好——老 pip 遇到同样的约束会默默挑一个不兼容的组合装上去,问题要等到运行时才炸。处理办法是顺着它列出的链路找到真正卡住的那个包,逐个放宽版本约束;如果有一批版本必须锁死,用 -c constraints.txt 单独写一个约束文件,比在 requirements.txt 里到处写死版本好维护。
想知道当前环境有没有已经被弄坏的依赖:
python -m pip check它会把「某个包要求 A>=2,但你装的是 1.x」这类问题列出来。装完一堆东西之后跑一下,比等运行时报 import 错误再回头查快得多。
七、升级 pip 这件事
装包时经常看到这句:
[notice] A new release of pip is available: 24.0 -> 24.2它只是提示,不影响这次安装的结果。要不要升看情况:--only-binary 之类的参数不生效、遇到奇怪的解析错误、需要新平台标签支持的时候,升级通常能解决;项目锁死了环境的情况,不动它也没问题。
python -m pip install --upgrade pip注意 venv 里的 pip 和系统的 pip 是两份,venv 里的要激活之后再升,否则升的是外面那个。
另一个省事的做法是建环境时就把 pip 一起升到最新:
python -m venv .venv --upgrade-deps--upgrade-deps 是 Python 3.9 加的,新建 venv 时顺手把 pip 和 setuptools 装成最新,省得进去之后先被提示一次。
八、常用命令速查
| 用途 | 命令 |
|---|---|
| 安装 | python -m pip install requests |
指定版本(两个等号,只写一个 = 会被当成文件名或报错) | python -m pip install requests==2.31.0 |
| 按依赖文件安装 | python -m pip install -r requirements.txt |
| 升级某个包 | python -m pip install -U requests |
| 卸载 | python -m pip uninstall requests |
| 列出已装包 | python -m pip list |
| 导出当前环境 | python -m pip freeze > requirements.txt |
| 看某个包的信息、装了哪些文件 | python -m pip show requests、python -m pip show -f requests |
| 看某个包有哪些版本 | python -m pip index versions requests |
| 检查依赖是否自洽 | python -m pip check |
| 看缓存位置 / 清缓存 | python -m pip cache dir、python -m pip cache purge |
表里「指定版本」和「导出当前环境」这两行值得单独说一句。导出依赖是 pip freeze > requirements.txt,那个是重定向符号;有些文章里写成 pip freeze -r requirements.txt,那个参数的含义是「只导出这个文件里已经有的包」并且会往输出里插注释,和想做的事正好相反。
另外搜索包:pip search 早就不能用了。PyPI 在 2020 年底关掉了它依赖的 XML-RPC 接口,现在敲会报:
ERROR: XMLRPC request failed [code: -32500]
RuntimeError: PyPI no longer supports 'pip search' (or XML-RPC search).
Please use https://pypi.org/search (via a browser) instead.想查某个已知包有哪些版本,用 pip index versions 包名;想按关键词找包,老老实实开浏览器去 pypi.org/search,pip 这边没有等价功能了。
最后几条习惯
每个项目一个 venv,别往系统 Python 里装东西。上面一半问题的根子都是「不知道这个包装到哪去了」,venv 直接把这个可能性掐掉。
命令尽量写成 python -m pip。多敲几个字符,换掉一整类排查工作。
源写进配置文件,别每次命令行上挂 -i。挂 -i 的坏处是:某次忘了加,那个包要么从官方源慢慢拖、要么直接超时,而你还以为自己早就配好了源。
参考资料
- pip 官方文档 · 安装与排错:https://pip.pypa.io/en/stable/installation/
- pip 官方文档 · 配置(pip config / pip.ini 位置):https://pip.pypa.io/en/stable/topics/configuration/
- pip search 的说明(官方已注明 PyPI 不再支持):https://pip.pypa.io/en/stable/cli/pip_search/
- 标准库文档 · ensurepip:https://docs.python.org/3/library/ensurepip.html
- PEP 668 · 系统级 Python 的外部管理环境:https://peps.python.org/pep-0668/
- PyPI 包搜索页:https://pypi.org/search/
评论区