侧边栏壁纸
博主头像
Setyg的博客

当秋风染红落叶的时候,就是新生~

  • 累计撰写 86 篇文章
  • 累计创建 66 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

pip 常规问题处理:命令丢失、装错环境、装不上包

Setyg
2026-09-28 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

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 --upgrade

ensurepip 从 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 requests

IDE 里更要留意,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 的坏处是:某次忘了加,那个包要么从官方源慢慢拖、要么直接超时,而你还以为自己早就配好了源。

参考资料

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区