摘要
你想解决在执行pip install(包括pip install -r requirements.txt)时,终端抛出NewConnectionError: [Errno -2] Name or service not known的问题,该错误核心指向DNS(域名系统)解析失败——pip无法将PyPI源的域名(如pypi.org)解析为对应的IP地址,导致无法建立网络连接。解决该问题的核心逻辑是:先验证DNS解析是否失效,再针对性修复(更换可解析的PyPI镜像源、配置可靠的DNS服务器、处理网络代理/防火墙限制),而非盲目升级pip或重复执行安装命令(无法解决域名解析问题)。
文章目录
- 摘要
- 一、问题核心认知:错误本质与典型表现
- 1.1 错误本质:DNS解析失败
- 1.2 典型错误表现(附新手误区解读)
- 1.3 DNS解析失败的核心特征
- 二、问题根源拆解:5大类核心诱因(附详细分析)
- 2.1 核心诱因1:系统DNS配置错误/失效(占比40%)
- 2.2 核心诱因2:pip默认源域名无法解析(占比25%)
- 2.3 核心诱因3:网络环境限制(代理/防火墙/VPN)(占比20%)
- 2.4 核心诱因4:系统网络参数异常(占比10%)
- 2.5 核心诱因5:临时DNS服务器/网络故障(占比5%)
- 三、系统化解决步骤:按优先级逐一修复(从验证到解决)
- 3.1 前置验证:5分钟定位DNS解析问题
- 3.1.1 步骤1:测试域名解析是否失效
- 3.1.2 步骤2:检查pip当前使用的源
- 3.2 方案1:更换国内PyPI镜像源(最快解决,占比65%)
- 3.2.1 临时使用(单次安装)
- 3.2.2 永久配置(推荐,后续无需重复指定)
- Linux/Mac
- Windows
- 3.2.3 常用国内镜像源(任选其一)
- 3.3 方案2:配置系统可靠DNS服务器(解决系统级DNS失效)
- 3.3.1 Linux(Ubuntu/Debian/CentOS)
- 临时配置(重启网络后失效)
- 永久配置(以Ubuntu 20.04+为例)
- 3.3.2 Windows
- 3.3.3 Mac
- 3.4 方案3:处理网络代理/防火墙限制
- 3.4.1 配置pip使用代理
- 3.4.2 关闭不必要的防火墙/安全软件
- 3.4.3 修复VPN异常后的DNS配置
- 3.5 方案4:修复系统网络参数(进阶)
- 3.5.1 修复Linux nsswitch.conf配置
- 3.5.2 手动映射PyPI域名到IP(应急方案)
- Linux/Mac
- Windows
- 3.6 方案5:验证修复效果
- 四、排障技巧:特殊场景的解决方案
- 4.1 问题1:Docker容器内DNS解析失败
- 原因分析
- 解决方案
- 4.2 问题2:虚拟环境(venv/conda)内DNS失效
- 原因分析
- 解决方案
- 4.3 问题3:企业内网仅允许访问内网镜像源
- 原因分析
- 解决方案
- 4.4 问题4:IPv6导致的DNS解析异常
- 原因分析
- 解决方案
- 五、预防措施:避免DNS解析问题的长期方案
- 5.1 核心规范:永久配置国内PyPI源
- 5.2 固定系统DNS服务器
- 5.3 自动化网络检查脚本
- 5.4 避免混用代理/VPN
- 六、总结
一、问题核心认知:错误本质与典型表现
要解决该问题,需先理解两个核心点:DNS解析的作用和该错误的触发逻辑,这是定位问题的根本前提:
1.1 错误本质:DNS解析失败
DNS的核心作用是将“域名(如pypi.org)”转换为“IP地址(如151.101.76.223)”,当出现Name or service not known时,意味着:
- 系统无法找到可用的DNS服务器解析PyPI源域名;
- 解析后的IP地址无法访问(但错误提示优先指向“域名识别失败”);
- pip发起网络请求时,第一步的域名解析就已失败,后续连接无法建立。
1.2 典型错误表现(附新手误区解读)
完整的报错信息示例:
$ pipinstallrequests Collecting requests Could not fetch URL https://pypi.org/simple/requests/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org',port=443): Max retries exceeded with url: /simple/requests/(Caused by NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f8a1b2c3d40>: Failed to establish a new connection: [Errno -2] Name or service not known'))Could notfinda version that satisfies the requirement requests(from versions:)No matching distribution foundforrequests新手常见误区:
- 误以为是pip版本过低/包不存在,反复执行
pip install --upgrade pip或检查包名; - 忽略“域名解析”核心问题,尝试修改pip的超时参数(如
--timeout 100); - 混淆“DNS解析失败”和“网络连接超时”,盲目关闭防火墙(无实际作用)。
1.3 DNS解析失败的核心特征
满足以下任一特征,可确认是DNS问题:
- ping PyPI源域名提示
unknown host:ping pypi.org→ping: pypi.org: Name or service not known; - 更换其他域名(如
baidu.com)也无法ping通(系统级DNS失效); - 直接用IP访问PyPI源可临时解决(如
https://151.101.76.223/simple/)。
二、问题根源拆解:5大类核心诱因(附详细分析)
2.1 核心诱因1:系统DNS配置错误/失效(占比40%)
最常见原因:系统默认的DNS服务器不可用(如ISP提供的DNS宕机、配置为空):
- Linux/Mac:
/etc/resolv.conf文件中无有效DNS服务器,或配置的DNS(如192.168.1.1)无法解析外网域名; - Windows:网络适配器的DNS配置为“自动获取”但未获取到,或手动配置的DNS失效;
- 多网卡环境(如同时连有线+无线),DNS配置指向未联网的网卡。
2.2 核心诱因2:pip默认源域名无法解析(占比25%)
- 国内网络环境下,
pypi.org/files.pythonhosted.org等默认源域名可能被DNS污染,无法解析; - 企业内网屏蔽了外网DNS解析,仅允许访问内网镜像源,但pip仍使用默认外网源。
2.3 核心诱因3:网络环境限制(代理/防火墙/VPN)(占比20%)
- 代理服务器配置错误:pip使用的代理无法解析域名,或代理本身不可用;
- 防火墙/安全软件拦截了DNS解析请求(如企业防火墙禁止访问外网DNS);
- VPN连接异常:VPN断开后未恢复本地DNS配置,导致域名解析失败。
2.4 核心诱因4:系统网络参数异常(占比10%)
- Linux:
nsswitch.conf中hosts配置错误(如优先使用files而非dns解析域名); - 本地hosts文件(
/etc/hosts或C:\Windows\System32\drivers\etc\hosts)未正确映射PyPI域名; - 网络接口(如eth0/wlan0)未启用DNS解析功能。
2.5 核心诱因5:临时DNS服务器/网络故障(占比5%)
- 公共DNS服务器(如8.8.8.8)临时宕机或网络拥堵;
- 本地网络波动(如路由器重启、宽带断连)导致DNS解析超时。
三、系统化解决步骤:按优先级逐一修复(从验证到解决)
解决该问题的核心逻辑是:先验证DNS解析→再更换可用的PyPI源→最后修复系统DNS配置,每个步骤附可执行的命令/操作示例:
3.1 前置验证:5分钟定位DNS解析问题
3.1.1 步骤1:测试域名解析是否失效
执行以下命令,验证系统能否解析PyPI源域名:
# 方式1:ping测试(跨平台)pingpypi.org# 若输出“Name or service not known”,确认DNS解析失败# 方式2:nslookup/dig精准测试DNS解析(推荐)# Linux/Macnslookuppypi.org# 输出“** server can't find pypi.org: NXDOMAIN”说明解析失败digpypi.org# Windows(CMD/PowerShell)nslookuppypi.org3.1.2 步骤2:检查pip当前使用的源
# 查看pip全局配置的源pip config list|grepindex-url# 若输出为空,说明使用默认源(pypi.org);若有值,检查该源域名是否可解析3.2 方案1:更换国内PyPI镜像源(最快解决,占比65%)
国内镜像源(如清华、阿里云)的域名易解析、访问速度快,是解决该问题的首选方案:
3.2.1 临时使用(单次安装)
执行pip install时通过-i指定国内源:
# 安装单个包(以requests为例)pipinstallrequests -i https://pypi.tuna.tsinghua.edu.cn/simple# 安装requirements.txtpipinstall-r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple3.2.2 永久配置(推荐,后续无需重复指定)
Linux/Mac
# 1. 创建pip配置目录(若不存在)mkdir-p ~/.config/pip# 2. 写入国内源配置cat>~/.config/pip/pip.conf<<EOF [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn timeout = 120 EOFWindows
- 打开文件资源管理器,输入
%APPDATA%并回车; - 在该目录下新建
pip文件夹,进入后新建pip.ini文件; - 写入以下内容:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn timeout = 1203.2.3 常用国内镜像源(任选其一)
| 镜像源名称 | 地址 |
|---|---|
| 清华源 | https://pypi.tuna.tsinghua.edu.cn/simple |
| 阿里云 | https://mirrors.aliyun.com/pypi/simple/ |
| 豆瓣源 | https://pypi.douban.com/simple/ |
| 中科大 | https://pypi.mirrors.ustc.edu.cn/simple/ |
3.3 方案2:配置系统可靠DNS服务器(解决系统级DNS失效)
若更换源后仍报错,说明系统DNS配置本身有问题,需配置公共DNS(如谷歌8.8.8.8、阿里云223.5.5.5):
3.3.1 Linux(Ubuntu/Debian/CentOS)
临时配置(重启网络后失效)
# 方式1:直接修改resolv.conf(需root)sudoecho"nameserver 223.5.5.5">/etc/resolv.conf# 阿里云DNSsudoecho"nameserver 8.8.8.8">>/etc/resolv.conf# 谷歌DNS# 方式2:重启网络服务# Ubuntu/Debiansudosystemctl restart systemd-resolved# CentOS/RHELsudosystemctl restart NetworkManager永久配置(以Ubuntu 20.04+为例)
- 编辑网络配置文件:
sudo nano /etc/netplan/01-network-manager-all.yaml; - 添加DNS配置(替换为实际网卡名,如
ens33):
network:ethernets:ens33:# 你的网卡名(通过ip addr查看)dhcp4:truenameservers:addresses:[223.5.5.5,8.8.8.8]version:2- 应用配置:
sudo netplan apply。
3.3.2 Windows
- 右键桌面“网络”→“属性”→“更改适配器选项”;
- 右键当前联网的网卡(如WLAN/以太网)→“属性”;
- 双击“Internet协议版本4 (TCP/IPv4)”;
- 选择“使用下面的DNS服务器地址”,输入:
- 首选DNS服务器:
223.5.5.5(阿里云); - 备用DNS服务器:
8.8.8.8(谷歌);
- 首选DNS服务器:
- 点击“确定”,重启网络连接。
3.3.3 Mac
- 打开“系统设置”→“网络”;
- 选择当前网络(如Wi-Fi)→“详细信息”→“DNS”;
- 点击“+”添加DNS服务器:
223.5.5.5、8.8.8.8; - 移除原有无效DNS,点击“好”→“应用”。
3.4 方案3:处理网络代理/防火墙限制
若处于企业内网/代理环境,需配置pip使用代理,或关闭拦截DNS的防火墙:
3.4.1 配置pip使用代理
# 临时使用(单次安装)pipinstallrequests -i https://pypi.tuna.tsinghua.edu.cn/simple --proxy http://代理IP:端口# 永久配置# Linux/Macpip configsetglobal.proxy http://代理IP:端口# Windowspip configsetglobal.proxy http://代理IP:端口# 若代理需要账号密码pip configsetglobal.proxy http://用户名:密码@代理IP:端口3.4.2 关闭不必要的防火墙/安全软件
- Linux:临时关闭firewalld/ufw(仅测试):
# Ubuntu/Debiansudoufw disable# CentOS/RHELsudosystemctl stop firewalld - Windows:关闭“Windows Defender防火墙”或第三方安全软件(如360、腾讯电脑管家)。
3.4.3 修复VPN异常后的DNS配置
若VPN断开后DNS失效,需恢复本地DNS:
# Linux:重启网络服务sudosystemctl restart NetworkManager# Windows:在网络适配器中重新选择“自动获取DNS服务器地址”3.5 方案4:修复系统网络参数(进阶)
3.5.1 修复Linux nsswitch.conf配置
确保系统优先使用DNS解析域名:
# 编辑nsswitch.confsudonano/etc/nsswitch.conf# 确保hosts行包含dns(如下)hosts: files dns myhostname3.5.2 手动映射PyPI域名到IP(应急方案)
若DNS服务器仍不可用,可手动修改hosts文件:
Linux/Mac
sudoecho"151.101.76.223 pypi.org">>/etc/hostssudoecho"151.101.108.223 files.pythonhosted.org">>/etc/hostsWindows
- 以管理员身份打开记事本,打开
C:\Windows\System32\drivers\etc\hosts; - 添加以下内容:
151.101.76.223 pypi.org 151.101.108.223 files.pythonhosted.org- 保存文件(若提示权限不足,先将hosts复制到桌面,修改后再替换回去)。
3.6 方案5:验证修复效果
执行以下命令,确认问题解决:
# 1. 测试DNS解析nslookuppypi.tuna.tsinghua.edu.cn# 应输出正常的IP地址# 2. 测试pip安装pipinstallrequests --dry-run# --dry-run模拟安装,无实际下载# 3. 若以上正常,执行实际安装pipinstall-r requirements.txt四、排障技巧:特殊场景的解决方案
4.1 问题1:Docker容器内DNS解析失败
原因分析
Docker默认使用宿主机DNS,若宿主机DNS配置错误,或容器网络模式限制DNS解析。
解决方案
修改Dockerfile,配置容器内DNS:
FROM python:3.9-slim # 配置容器内DNS(阿里云+谷歌) RUN echo "nameserver 223.5.5.5" > /etc/resolv.conf \ && echo "nameserver 8.8.8.8" >> /etc/resolv.conf # 配置pip国内源 RUN mkdir -p ~/.config/pip \ && echo "[global]" > ~/.config/pip/pip.conf \ && echo "index-url = https://pypi.tuna.tsinghua.edu.cn/simple" >> ~/.config/pip/pip.conf # 安装依赖 COPY requirements.txt . RUN pip install -r requirements.txt CMD ["python", "app.py"]或运行容器时指定DNS:
dockerrun --dns223.5.5.5 --dns8.8.8.8 -it your-image:latest4.2 问题2:虚拟环境(venv/conda)内DNS失效
原因分析
虚拟环境继承了宿主机的DNS配置,但代理/源配置未同步。
解决方案
# 1. 激活虚拟环境sourcevenv/bin/activate# Linux/Macvenv\Scripts\activate# Windows# 2. 在虚拟环境内配置pip源(与全局配置隔离)pip configsetglobal.index-url https://pypi.tuna.tsinghua.edu.cn/simple4.3 问题3:企业内网仅允许访问内网镜像源
原因分析
企业防火墙禁止访问外网DNS,仅允许访问内网PyPI镜像。
解决方案
- 确认内网镜像源地址(如
http://192.168.10.50:8080/simple); - 配置pip使用内网源:
pip configsetglobal.index-url http://192.168.10.50:8080/simple pip configsetglobal.trusted-host192.168.10.50# 信任内网源(非HTTPS)4.4 问题4:IPv6导致的DNS解析异常
原因分析
系统优先使用IPv6解析域名,但网络未启用IPv6,导致解析失败。
解决方案
临时禁用IPv6(Linux):
sudosysctl -w net.ipv6.conf.all.disable_ipv6=1sudosysctl -w net.ipv6.conf.default.disable_ipv6=1或配置pip优先使用IPv4:
pipinstallrequests -i https://pypi.tuna.tsinghua.edu.cn/simple --prefer-binary五、预防措施:避免DNS解析问题的长期方案
5.1 核心规范:永久配置国内PyPI源
将国内源配置写入项目文档,确保团队所有成员使用相同源:
# 项目根目录创建pip.conf(Linux/Mac)或pip.ini(Windows),提交到代码库# 成员拉取代码后,执行以下命令生效cppip.conf ~/.config/pip/# Linux/Maccppip.ini %APPDATA%\pip\# Windows5.2 固定系统DNS服务器
将公共DNS(阿里云223.5.5.5、腾讯119.29.29.29)配置为系统默认DNS,避免依赖不稳定的ISP DNS。
5.3 自动化网络检查脚本
在项目CI/CD或启动脚本中添加DNS检查,提前发现问题:
#!/bin/bash# check_dns.shecho"测试PyPI源DNS解析..."ifnslookuppypi.tuna.tsinghua.edu.cn>/dev/null2>&1;thenecho"DNS解析正常"elseecho"DNS解析失败,自动配置阿里云DNS..."sudoecho"nameserver 223.5.5.5">/etc/resolv.conffi# 执行pip安装pipinstall-r requirements.txt5.4 避免混用代理/VPN
使用代理/VPN时,确保pip的代理配置与系统代理一致;断开VPN后,及时恢复本地DNS配置。
六、总结
解决pip install报NewConnectionError: [Errno -2] Name or service not known的核心思路是定位DNS解析失效的层级(源/系统/网络),针对性修复,关键要点如下:
- 错误本质:pip无法解析PyPI源的域名,核心是DNS解析失败,而非pip本身问题;
- 核心解决方案:
- 优先更换国内PyPI镜像源(清华/阿里云),快速绕过外网DNS问题;
- 配置系统可靠DNS(223.5.5.5/8.8.8.8),解决系统级DNS失效;
- 处理代理/防火墙限制,确保网络环境允许DNS解析和包下载;
- 特殊场景:Docker容器需单独配置DNS,企业内网使用内网镜像源;
- 预防核心:永久配置国内源、固定系统DNS、添加自动化DNS检查。
遵循以上规则,可彻底解决pip安装时的DNS解析问题,同时保证包安装的稳定性和速度。
【专栏地址】
更多 Python包管理、网络配置解决方案,欢迎订阅我的 CSDN 专栏:🔥全栈BUG解决方案